2014-10-05 8 views
7

Der Code, den ich jetzt bin mit:Wie liest man den POST-Anfragetext in einem Handler richtig?

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(); 

Es scheint, OK zu arbeiten, aber ich bin mir nicht sicher über die Notwendigkeit clear() ByteBuffer bevor es an den Pool zurück. Ich bin mir nicht einmal sicher, exchange.getConnection().getBufferPool().allocate(); zu verwenden. Es gibt nicht viel darüber in der Dokumentation.

Antwort

3

Eine einfachere Möglichkeit, den Anfragetext zu lesen, besteht darin, an einen Worker-Thread zu senden, der HttpExchange#getInputStream() zur Verfügung stellt.

Es gibt zwei Möglichkeiten, dies zu tun: Verwenden Sie eine BlockingHandler oder das Versandmuster, das in der documentation gezeigt wird. Hier ist ein Beispiel für die Verwendung der BlockingHandler:

new BlockingHandler(myHandler)

Die BlockingHandler im Grunde tut den Versand für Sie.

0

@atok, Ich benutze Ihre Methode für eine Weile, aber manchmal bekomme ich einen leeren Körper, wenn der Stream vor dem Leseanruf geschlossen ist. Das funktioniert wie Charme:

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(); 
Verwandte Themen