Получить тело 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
!