2015-07-03 4 views
0

У меня есть следующий код python, который получает POST Data и записывает его в файл.Получить эквивалент данных 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"); 
}