Retrieve HTTP Body in NanoHTTPD

前端 未结 3 1309
一生所求
一生所求 2021-02-07 03:01

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

I\'ve tried to use the getInputStream() m

相关标签:
3条回答
  • 2021-02-07 03:50

    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.
    }
    
    0 讨论(0)
  • 2021-02-07 03:59

    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!

    0 讨论(0)
  • 2021-02-07 04:01

    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.

    0 讨论(0)
提交回复
热议问题