Http Requests with Bodies Crash Program

时间:2016-01-08 21:38:50

标签: java eclipse apache http post

我试图从客户端向服务器发送帖子请求。目前客户端和服务器都在我的计算机上运行。获取请求工作正常,但发布请求会破坏客户端,服务器永远不会看到它们。

这是我服务器的ServletHandler(使用jetty)的样子:

public class ServletHandler extends AbstractHandler {

    //other code

    @Override
    public void handle(String target, Request baseRequest,
            HttpServletRequest request, HttpServletResponse response)
                throws IOException, ServletException {
        if (baseRequest.getMethod().equals("POST")) {
            doPost(request, response);
        } else if (baseRequest.getMethod().equals("GET")) {
            doGet(request, response);
        } else if (baseRequest.getMethod().equals("DELETE")) {
            doDelete(request, response);
        }
    }
}

doPost(request, response);

行永远不会被调用(我在eclipse中有一个断点)。但是,doGet()行始终被调用。客户端可以毫无问题地发送。

对于客户端我使用maven的apache httpclient的最新版本(我使用了jetty但是这导致了类似的问题,当我尝试连接Json时,代码中的一些空指针很深,所以我试过阿帕奇)。这是我的客户端上的代码在发布请求(损坏)中的样子:

private void processRequest(String path, Object o) {
    String s = null;
    if (o != null)
        s = new Gson().toJson(o);
    try {
        HttpPost post = new HttpPost(serverURL + path);
        post.setHeader("Accept", "application/json");
        post.setHeader("Content-type", "application/json");
        post.setEntity(new ByteArrayEntity(s.getBytes("UTF-8")));
        client.execute(post);
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

当我在调试器中运行它并逐行执行时,我会到达这一行

        client.execute(post);

点击"下一行"在日食中它永远不会到达下一行。该计划变得没有反应。注意:变量s确实包含一个格式良好的Json对象,我检查过。

如果我删除此行

post.setEntity(new ByteArrayEntity(s.getBytes("UTF-8")));

一切正常。调用doPost行,服务器可以响应。一切都很好。我甚至尝试过使用apacheHttpClient中的StringEntity,它做了同样的事情。

我想我可以只包含一个命名值对并映射" body"对于json,但那并不是我使用过的api。

请告诉我,我是个傻瓜,这很容易解决。

编辑:调试器告诉我s等于这个字符串:{" row":22," col":0," type&#34 ;:"岩石"}

1 个答案:

答案 0 :(得分:0)

只是一个猜测 ,因为您的代码看起来很好,从您的描述中出现了一些“怪异”的东西。

在使用ByteArrayEntity进行设置之前,我会尝试设置setEntity实例的内容类型。如在

try {
    HttpPost post = new HttpPost(serverURL + path);
    // post.setHeader("Accept", "application/json");
    // post.setHeader("Content-type", "application/json");
    ByteArrayEntity content = new ByteArrayEntity(s.getBytes("UTF-8"));
    content.setContentType("application/json");
    post.setEntity(content);
    client.execute(post);
}