Получить тело HTTP в NanoHTTPD

Как я могу получить тело запроса HTTP POST при реализации метода NanoHTTPD serve?

Я уже пытался использовать метод getInputStream() IHTTPSession, но всегда пользуюсь SocketTimeoutException при использовании его внутри метода serve.

Ответы

Ответ 1

В методе serve вам сначала нужно вызвать session.parseBody(files), где files - Map<String, String>, а затем session.getQueryParameterString() вернет тело запроса POST.

Я нашел пример в исходном коде. Вот соответствующий код:

public Response serve(IHTTPSession session) {
    Map<String, String> files = new HashMap<String, String>();
    Method method = session.getMethod();
    if (Method.PUT.equals(method) || Method.POST.equals(method)) {
        try {
            session.parseBody(files);
        } catch (IOException ioe) {
            return new Response(Response.Status.INTERNAL_ERROR, MIME_PLAINTEXT, "SERVER INTERNAL ERROR: IOException: " + ioe.getMessage());
        } catch (ResponseException re) {
            return new Response(re.getStatus(), MIME_PLAINTEXT, re.getMessage());
        }
    }
    // get the POST body
    String postBody = session.getQueryParameterString();
    // or you can access the POST request parameters
    String postParameter = session.getParms().get("parameter");

    return new Response(postBody); // Or postParameter.
}

Ответ 2

В экземпляре IHTTPSession вы можете вызвать метод .parseBody(Map<String, String>), который затем заполнит карту, предоставленную с некоторыми значениями.

Впоследствии ваша карта может содержать значение под клавишей postBody.

        final HashMap<String, String> map = new HashMap<String, String>();
        session.parseBody(map);
        final String json = map.get("postData");

Это значение будет удерживать ваше тело сообщений.

Код, который делает это, можно найти здесь.

Ответ 3

Я думаю, что session.getQueryParameterString(); не работает в этом случае.

Если вы используете POST, PUT, вы должны попробовать этот код:

Integer contentLength = Integer.parseInt(session.getHeaders().get("content-length"));
byte[] buffer = new byte[contentLength];
session.getInputStream().read(buffer, 0, contentLength);
Log.d("RequestBody: " + new String(buffer));

На самом деле я попробовал IOUtils.toString(inputstream, encoding), но это вызвало Timeout exception!