Java 在NanoHTTPD中检索HTTP正文
在实现sJava 在NanoHTTPD中检索HTTP正文,java,nanohttpd,Java,Nanohttpd,在实现sservice方法时,如何检索HTTPPOST请求正文 我已经尝试过使用IHTTPSession的getInputStream()方法,但是在service方法中使用时,我总是会得到一个SocketTimeoutException。在service方法中,首先必须调用session.parseBody(files),其中文件是一个映射,然后会话。getQueryParameterString()将返回POST请求的正文 我在源代码中找到了。以下是相关代码: public Response
service
方法时,如何检索HTTPPOST
请求正文
我已经尝试过使用
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数据不是纯字符串格式时,这比其他方法更好