Java 在NanoHTTPD中检索HTTP正文

Java 在NanoHTTPD中检索HTTP正文,java,nanohttpd,Java,Nanohttpd,在实现sservice方法时,如何检索HTTPPOST请求正文 我已经尝试过使用IHTTPSession的getInputStream()方法,但是在service方法中使用时,我总是会得到一个SocketTimeoutException。在service方法中,首先必须调用session.parseBody(files),其中文件是一个映射,然后会话。getQueryParameterString()将返回POST请求的正文 我在源代码中找到了。以下是相关代码: public Response

在实现s
service
方法时,如何检索HTTP
POST
请求正文


我已经尝试过使用
IHTTPSession
getInputStream()
方法,但是在
service
方法中使用时,我总是会得到一个
SocketTimeoutException

service
方法中,首先必须调用
session.parseBody(files)
,其中
文件
是一个
映射
,然后
会话。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's parameters
    String postParameter = session.getParms().get("parameter");

    return new Response(postBody); // Or postParameter.
}
公众响应服务(IHTTP会话){
映射文件=新的HashMap();
Method=session.getMethod();
if(Method.PUT.equals(Method)| Method.POST.equals(Method)){
试一试{
session.parseBody(文件);
}捕获(ioe异常ioe){
返回新的响应(Response.Status.INTERNAL_ERROR,MIME_明文,“服务器内部错误:IOException:”+ioe.getMessage());
}捕获(响应异常re){
返回新的响应(re.getStatus(),MIME_明文,re.getMessage());
}
}
//去拿柱子
String postBody=session.getQueryParameterString();
//或者您可以访问POST请求的参数
字符串后参数=session.getParms().get(“参数”);
返回新响应(postBody);//或后参数。
}

IHTTPSession
实例上,您可以调用
.parseBody(Map)
方法,然后该方法将用一些值填充您提供的映射

之后,映射可能会在键
postBody
下包含一个值

        final HashMap<String, String> map = new HashMap<String, String>();
        session.parseBody(map);
        final String json = map.get("postData");
final HashMap map=new HashMap();
会话.解析体(map);
最后一个字符串json=map.get(“postData”);
然后,该值将保留您的主体


我想
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)
,但它导致了
超时异常

任何原因
session.parseBody(文件)
都必须在
session.getQueryParameterString()
?@vatsa我快速查看了源代码:在处理非多部分/表单数据请求时,session.parseBody(文件)读取POST请求的主体和方法,它将queryParameterString和parms字段值设置为帖子的正文。如果不调用session.parseBody(),这些字段是空的。到目前为止,这是最好的解决方案,尤其是在使用JSON时。请注意,如果内容类型是
application/x-www-form-urlencoded
,则参数的内容可以在
session.getParms()下找到
而不是您提供的
映射
对象当
内容类型
application/json
@Rinmalavi时,唯一适用于我的解决方案是
应用程序/json
@Rinmalavi感谢您将链接发布到代码中清晰的
文件。put(“postData”,postLine)人们需要使用
postData
来获取数据……但是有没有任何文档形式的链接呢?@CrandellWS我记得在'14年使用过它,文档大部分都是代码本身。不知道事情是否改变了。抱歉,没有回答。如何使用get方法从URL获取参数?
session.getHeaders().get(“内容长度”)
==null?当post数据不是纯字符串格式时,这比其他方法更好