2015-07-03 57 views
0

我有下面的Python代碼接收POST數據並將其寫入文件。接收POST數據在Java中的等效數據

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應用程序正在接收整個數據集。

UPDATE(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(""); 
} 
+2

請顯示您的Java代碼。 SO不是代碼翻譯服務。 –

回答

0

contentLength變量始終是零,因爲NanoHTTPD所有頭轉換成小寫它們存儲到一個地圖前。因此,要獲得的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"); 
}