6

我正在用 Java 开发 Android 和服务器应用程序。服务器应用程序在 Jetty 上运行。Android 应用程序在同一台计算机上模拟。

Android 应用程序向服务器发送 POST 请求,但服务器的处理程序将其解释为 GET。

当我使用Send HTTP Tool模拟 POST 请求时,它可以完美运行(我的意思是方法的类型是 POST)。

这是 Android 应用程序的代码片段:

HttpClient client = new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(client.getParams(),
        10000); // Timeout Limit
HttpResponse response;

// Create message
JSONObject json = new JSONObject();
json.put("request_type", "info");
json.put("user_name", mEmail);

// Send message and get response
StringEntity se = new StringEntity(json.toString());
se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
HttpPost post = new HttpPost("http://10.0.2.2:8080/app");
post.setEntity(se);
post.setHeader("Accept", "application/json");
post.setHeader("Content-Type", "application/json; charset=UTF-8");
response = client.execute(post);

这是处理程序的代码:

public void handle(String target, Request baseRequest, 
    HttpServletRequest request, HttpServletResponse response) {
    System.out.println(request.getMethod());
}

我不知道可能是什么问题,因为我认为如果我使用 HttpPost,方法类型应该是 POST。

4

1 回答 1

17

如果可以,请您发布您的完整处理程序或处理程序初始化。但我会猜测答案。

我感觉您的 POST 请求实际上是通过 302 重定向的,因此处理程序正确地将其作为 GET 请求接收。

默认情况下,具有“/app”上下文的 Jetty ContextHandler 实际上会将任何请求重定向到“/app”到“/app/”,请查看setAllowNullPathInfo

因此,您有 2 种可能的解决方案,调用setAllowNullPathInfo(true)ContextHandler,或将客户端上的帖子网址更改为HttpPost post = new HttpPost("http://10.0.2.2:8080/app/");

它可能会帮助您在码头上启用 RequestLogs,请参阅Jetty/Tutorial/RequestLog

使用以下服务器,您可以通过请求日志查看对 /app 的请求和对 /app/ 的请求之间的区别。

public class RequestLogPost {

  public static class PostHandler extends ContextHandler {
    public PostHandler() {
      setContextPath("/app");
      // setAllowNullPathInfo(true); // enable to see difference in request handling
    }

    @Override
    public void doHandle(String target, Request baseRequest, HttpServletRequest request,
        HttpServletResponse response) throws IOException, ServletException {
      System.out.println(request.getMethod());
      response.setStatus(HttpStatus.OK_200);
      baseRequest.setHandled(true);
    }
  }

  public static void main(String[] args) throws Exception {
    Server server = new Server(5555);

    HandlerCollection handlers = new HandlerCollection();
    handlers.addHandler(new PostHandler());
    handlers.addHandler(new DefaultHandler());
    handlers.addHandler(createRequestLogHandler());

    server.setHandler(handlers);

    server.start();
    server.join();
  }

  private static RequestLogHandler createRequestLogHandler() {
    final int RETAIN_FOREVER = 0; // see RolloverFileOutputStream, 0 == forever.
    RequestLogHandler logHandler = new RequestLogHandler();

    NCSARequestLog ncsaRequestLog = new AsyncNCSARequestLog("requests.log");
    ncsaRequestLog.setAppend(true);
    ncsaRequestLog.setExtended(true);
    ncsaRequestLog.setLogTimeZone("GMT");
    ncsaRequestLog.setRetainDays(RETAIN_FOREVER);
    logHandler.setRequestLog(ncsaRequestLog);
    return logHandler;
  }
}

从请求日志中,将请求发布到“/app”,导致 302

[30/Jul/2013:12:28:09 +0000]“POST /app HTTP/1.1”302 0

[30/Jul/2013:12:28:09 +0000]“GET /app/HTTP/1.1”200 0

直接请求“/app/”:

[30/Jul/2013:12:28:16 +0000]“POST /app/HTTP/1.1”200 0

于 2013-07-30T12:14:54.990 回答