java - Ajax PUT 请求接收空响应

标签 java http servlets

我已经编写了一个 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/

相关文章:

java - 如何使用 jxl 逐张读取 excel 文件

java - 基于参数在父类中使用子类的静态成员

http - "Age: 0"HTTP header

android - 网络调用在 android 中抛出 IO 异常和连接被拒绝在 android 设备中不工作

java - System.out 写在 servlet 中的什么地方?

java - 当我尝试将 Object 转换为 List<Object> 时发出警告

java - 在 typeahead 中选择具有更改 ID 的元素 java-selenium

php - 如何只加载 html(并跳过媒体文件)

java - HTTP 状态 404 - 未找到 Servlet

eclipse - IllegalArgumentException : The servlets named [test] and [pack. HelloWorld] 都映射到不允许的 url 模式 [/another/path]