我有以下python代码接收POST数据并将其写入文件。
def do_POST(self):
content_length = self.headers['content-length']
content = self.rfile.read(int(content_length))
with open("filename.txt", 'w') as f:
f.write(content.decode())
self.send_response(200)
Java中的等价物是什么?我使用NanoHTTPD作为HTTP服务器但由于某些原因,我的Java应用程序只接收带有没有数据的头文件的POST请求,而python应用程序正在接收整个数据集。
更新(Java代码):
public Response serve(IHTTPSession session)
{
Method method = session.getMethod();
String uri = session.getUri();
LOG.info(method + " '" + uri + "' ");
Map<String, String> headers = session.getHeaders();
String cl = headers.get("Content-Length");
int contentLength = 0
if (null != cl)
{
contentLength = Integer.parseInt(cl);
}
InputStream is = session.getInputStream();
int nRead;
byte[] data = new byte[contentLength];
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
try
{
LOG.info("Start Read Data");
while ((nRead = is.read(data, 0, data.length)) != -1)
{
LOG.info("Read Data: " + nRead);
buffer.write(data, 0, nRead);
}
buffer.flush();
LOG.info("Result: " + new String(buffer.toByteArray(), "UTF-8"));
}
catch (IOException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
return newFixedLengthResponse("");
}
答案 0 :(得分:0)
您的contentLength
变量始终为零,因为NanoHTTPD会将所有标题转换为小写,然后再将其存储到Map中。因此,要获取Content-Length标头,您应该使用:
String cl = headers.get("content-length");
int contentLength = 0
if (null != cl)
{
contentLength = Integer.parseInt(cl);
}
或者,IHTTPSession
提供方法parseBody(Map<String, String> map)
。如果内容类型为application/x-www-form-urlencoded
,则正文将被解码为地图。否则(其他内容类型),地图将包含一个键"postData"
,它是请求的正文。
Map<String, String> requestBody = new HashMap<String, String>();
try {
session.parseBody(requestBody);
} catch (Exception e) {
e.printStackTrace();
}
String parameters = null;
if (requestBody.containsKey("postData")) {
parameters = requestBody.get("postData");
}