使用Java Apache httpcore5框架创建HTTP服务器时,如何检索POST的请求正文

时间:2018-08-30 15:41:25

标签: java apache-httpcomponents

我正在使用Apache httpcore5 framework创建一个HTTP服务器。我正在实现AsyncServerRequestHandler。我实现的方法是

public void handle(Message<HttpRequest, ?> message, ResponseTrigger responseTrigger, HttpContext httpContext)

不幸的是,如果我打电话给message,则我通过的null返回getBody()。我需要该正文,因为它包含POST的CGI参数。

(edit):我的prepare()方法看起来像

public AsyncRequestConsumer<Message<HttpRequest, Void>> prepare(HttpRequest request, HttpContext context)
//        throws HttpException
{
    return new BasicRequestConsumer<Void>(new NoopEntityConsumer());
} 

对于那些正在快速阅读本文的人:我是服务器。我不是在问客户端如何执行POST。我在问服务器如何获得对POST正文的访问权限,以便它可以正确响应。 我如何获得该邮件正文?

1 个答案:

答案 0 :(得分:0)

托马斯·凯利的问题使我想出了问题。通过切换到implements AsyncServerRequestHandler<Message<HttpRequest, byte[]>> 并将我的prepare()重写为

public AsyncRequestConsumer<Message<HttpRequest, byte[]>> prepare(HttpRequest request, HttpContext context)
{
    if (request.getMethod().equals("GET"))
        return new BasicRequestConsumer(new NoopEntityConsumer()); // is that one client bananas?

    AsyncEntityConsumer<byte[]> dataConsumer = new BasicAsyncEntityConsumer();
    return new BasicRequestConsumer<>(dataConsumer);
}

我能够使用message.getBody()访问POST请求正文。 if的GET分支用于解决嵌入式HTTP客户端,如果我将BasicAsyncEntityConsumer与GET一起使用的话,该客户端似乎会失败。