在Java中接收等效的POST数据

时间:2015-07-03 15:23:18

标签: java http nanohttpd

我有以下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("");
}

1 个答案:

答案 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");
}