Как вы получаете тело запроса POST при создании HTTP-сервера с использованием Java Apache httpcore5 framework - PullRequest
0 голосов
/ 30 августа 2018

Я создаю HTTP-сервер, используя Apache httpcore5 framework . Я реализую AsyncServerRequestHandler. Метод, который я реализую, -

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

К сожалению, message, который мне передают, возвращает null, если я позвоню getBody(). Мне нужно это тело, потому что оно содержит аргументы CGI для POST.

(редактировать): мой метод prepare () выглядит как

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

Для людей, которые быстро читают это: я сервер. Я не спрашиваю, как клиент выполняет POST. Я спрашиваю, как сервер получает доступ к телу POST, чтобы он мог правильно ответить. Как мне получить это тело сообщения?

1 Ответ

0 голосов
/ 05 сентября 2018

Вопрос Томаса Келли заставил меня понять проблему. Путем переключения на 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);
}

Мне удалось получить доступ к телу запроса POST, используя message.getBody(). Ветвь GET в if предназначена для работы со встроенным HTTP-клиентом, который, похоже, не работает, если я использую BasicAsyncEntityConsumer с GET.

...