我试图从客户端向服务器发送帖子请求。目前客户端和服务器都在我的计算机上运行。获取请求工作正常,但发布请求会破坏客户端,服务器永远不会看到它们。
这是我服务器的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 ;:"岩石"}
答案 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);
}