2014-10-05 13 views
7

Kod używam teraz:Jak poprawnie odczytać treść żądania POST w module obsługi?

Pooled<ByteBuffer> pooledByteBuffer = exchange.getConnection().getBufferPool().allocate(); 
    ByteBuffer byteBuffer = pooledByteBuffer.getResource(); 

    int limit = byteBuffer.limit(); 

    byteBuffer.clear(); 

    exchange.getRequestChannel().read(byteBuffer); 
    int pos = byteBuffer.position(); 
    byteBuffer.rewind(); 
    byte[] bytes = new byte[pos]; 
    byteBuffer.get(bytes); 

    String requestBody = new String(bytes, Charset.forName("UTF-8")); 

    byteBuffer.clear(); 
    pooledByteBuffer.free(); 

wydaje się działać OK, ale nie jestem pewien, o potrzebie clear() ByteBuffer przed wpuszczeniem go do basenu. Nie jestem nawet pewien, czy używać exchange.getConnection().getBufferPool().allocate();. W dokumentacji nie ma zbyt wiele informacji.

Odpowiedz

3

Prostszym sposobem odczytywania treści żądania jest wysłanie do wątku roboczego, co udostępnia HttpExchange#getInputStream().

Można to zrobić na dwa sposoby: korzystając z BlockingHandler lub wzoru wysyłki przedstawionego w documentation. Oto przykład z użyciem BlockingHandler:

new BlockingHandler(myHandler)

BlockingHandler zasadzie robi wysyłania dla ciebie.

0

@atok, używam Twojej metody przez jakiś czas, ale czasami otrzymuję puste ciało, gdy strumień jest zamknięty przed wywołaniem odczytu. Działa to jak urok:

BufferedReader reader = null; 
StringBuilder builder = new StringBuilder(); 

try { 
    exchange.startBlocking(); 
    reader = new BufferedReader(new InputStreamReader(exchange.getInputStream())); 

    String line; 
    while((line = reader.readLine()) != null) { 
     builder.append(line); 
    } 
} catch(IOException e) { 
    e.printStackTrace(); 
} finally { 
    if(reader != null) { 
     try { 
      reader.close(); 
     } catch(IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

String body = builder.toString(); 
Powiązane problemy