Retrieve HTTP Body in NanoHTTPD

最后都变了- 提交于 2019-12-20 17:31:47

问题


How can I retrieve the HTTP POST request body when implementing NanoHTTPDs serve method?

I've tried to use the getInputStream() method of IHTTPSession already, but I always get an SocketTimeoutException when using it inside of the serve method.


回答1:


In the serve method you first have to call session.parseBody(files), where files is a Map<String, String>, and then session.getQueryParameterString() will return the POST request's body.

I found an example in the source code. Here is the relevant code:

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's parameters
    String postParameter = session.getParms().get("parameter");

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



回答2:


On a IHTTPSession instance you can call the .parseBody(Map<String, String>) method which will then fill the map you provided with some values.

Afterwards your map may contain a value under the key postBody.

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

This value will then hold your posts body.

Code that does this, can be found here.




回答3:


I think session.getQueryParameterString(); not work in this case.

If you using POST, PUT, you should want to try this code:

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));

In fact, I tried IOUtils.toString(inputstream, encoding) but it cause Timeout exception!



来源:https://stackoverflow.com/questions/22349772/retrieve-http-body-in-nanohttpd

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!