AJAX-запрос PUT, получающий пустой ответ - PullRequest
2 голосов
/ 30 марта 2012

Я написал HttpCRUDServlet, который будет выполнять следующие задачи (пока).

  • Отвечать на метод OPTIONS с соответствующими заголовками CORS (service()),
  • Разобрать и вставить данные, переданные в запросе PUT, в базу данных (doPut()).

Кажется, что все функции работают нормально, за исключением того, что клиент получает пустой ответ.

Вот источник:

package com.gamersdemokrasy.http;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.JSONException;
import org.json.JSONObject;

import com.gamersdemokrasy.DAO;
import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException;

/**
 * Servlet implementation class HttpCRUDServlet
 */
public class HttpCRUDServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private String uri = null;

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
}

/*
 * @see HttpServlet#doDelete(HttpServletRequest, HttpServletResponse)
 */
@Override
protected void doDelete(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    // TODO Auto-generated method stub
    super.doDelete(request, response);
}

/*
 * @see HttpServlet#doPut(HttpServletRequest, HttpServletResponse)
 */
@Override
protected void doPut(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    JSONObject dataJson = getJsonData(new BufferedReader(new InputStreamReader(request.getInputStream())).readLine());

    response.getWriter().println("Hello");
    DAO dao = new DAO();
    try {
        if(dao.create(dataJson, uri)) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else if(dao.getException() instanceof MySQLIntegrityConstraintViolationException) {
            response.setContentType("text/plain");
            response.getWriter().println(dao.getException().getMessage());
            response.setStatus(HttpServletResponse.SC_CONFLICT);
            dao.getException().printStackTrace();
        } else if(dao.getException() instanceof Exception) {
            response.setContentType("text/plain");
            response.getWriter().println(dao.getException().getMessage());
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            dao.getException().printStackTrace();
        }
    } finally {
        response.getWriter().flush();
        response.getWriter().close();
    }

}

/**
 * Converts a parameter string into a JSONObject
 * 
 * @param data
 * @return
 */
private JSONObject getJsonData(String data) {
    JSONObject json = new JSONObject();

    String[] params = data.split("&");
    try {
        for(String param:params) {
            String tokens[] = param.split("=");
            json.accumulate(URLDecoder.decode(tokens[0].trim(),"utf-8"), URLDecoder.decode(tokens[1].trim(),"utf-8"));
        }
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return json;
}

/*
 * @see HttpServlet#service(HttpServletRequest, HttpServletResponse)
 */
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    String method = request.getMethod();
    uri = request.getRequestURI().replaceFirst(request.getContextPath(), "");
    while(uri.endsWith("/")) {
        uri = uri.substring(0, uri.length()-1);
    }
    System.out.println("Debug>> Request:"+method + " " + uri);
    System.out.println("Debug>> ContextPath:"+request.getContextPath());

    if(request.getMethod().equals("OPTIONS")) {
        // Set CORS headers
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods",
                "PUT,GET,POST,DELETE");
        response.setHeader("Allow", "PUT,GET,POST,DELETE");
        response.setHeader("Access-Control-Max-Age", "180");
        response.setHeader("Access-Control-Allow-Headers", "Content-type");
    } else if(method.equals("PUT") || method.equals("GET")
            || method.equals("POST") || method.equals("DELETE")) {
        super.service(request, response);
    }
}

}

Вот код Ajax:

    $.ajax({
        url: 'http://localhost:8080/gamedem/user/',
        type: 'PUT',
        data: {
            id: 'dominick',
            nick: 'pr@da.n4m3s!s',
            phno: '9739097300',
            steam_id: 'lorddominique',
            games_played: 'cs1.6'
            //phno1: 9999999999
        },
        //contentType: 'text/plain',
        contentType: 'application/json',
        success: function() {
            alert("Resource Created");
        }
    });

Я использую Firebug на iceweasel 3.5.16 и ответ 409 Conflict (ожидается). Однако вкладка ответа под запросом PUT пуста.

Теперь, почему ответ пуст? Я уверен, что написал ошибку в response.printWriter, а затем очистил и закрыл ее.

Ответы [ 2 ]

0 голосов
/ 30 марта 2012

Из Javadoc для HttpServletResponse.setStatus:

Контейнер очищает буфер и устанавливает заголовок Location, сохраняя куки и другие заголовки.

Попробуйте позвонить setStatus, прежде чем писать сообщение о состоянии автору ответов.

0 голосов
/ 30 марта 2012

Когда есть ошибка, я не думаю, что вы увидите что-либо по ошибке. Вы получите соответствующий код ошибки. Согласно спецификации HTTP: Вот ссылка для спецификации HTTP.

Если создан новый ресурс, сервер происхождения ДОЛЖЕН сообщить пользовательский агент через ответ 201 (Создан). Если существующий ресурс изменен, либо ответные коды 200 (ОК) или 204 (без содержимого) СЛЕДУЕТ отправить, чтобы указать успешное завершение запроса. Если ресурс не может быть создан или изменен с помощью Request-URI, Должен быть дан соответствующий ответ об ошибке, который отражает характер проблемы

...