我已经编写了一个 HttpCRUDServlet,它将执行以下任务(到目前为止)。
- 使用适当的 CORS header (
service()
) 响应 OPTIONS 方法, - 解析 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");
}
});
我在 iceweasel 3.5.16 上使用 Firebug,响应为 409 冲突(预期)。但是,PUT 请求下的响应选项卡是空的。
现在,为什么响应是空的?我确实在 response.printWriter
中写入了错误,然后刷新并关闭了它。
最佳答案
当出现错误时,我认为您不会看到任何错误。您将获得相应的错误代码。根据 HTTP 规范:这里是 link用于 HTTP 规范。
If a new resource is created, the origin server MUST inform the user agent via the 201 (Created) response. If an existing resource is modified, either the 200 (OK) or 204 (No Content) response codes SHOULD be sent to indicate successful completion of the request. If the resource could not be created or modified with the Request-URI, an appropriate error response SHOULD be given that reflects the nature of the problem
关于java - Ajax PUT 请求接收空响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9949281/