2014-10-05 11 views
7

Il codice che sto usando ora:Come leggere correttamente il corpo della richiesta POST in un gestore?

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

sembra funzionare male, ma non sono sicuro circa la necessità di clear() ByteBuffer prima di tornare alla piscina. Non sono nemmeno sicuro di usare exchange.getConnection().getBufferPool().allocate();. Non c'è molto a riguardo nella documentazione.

risposta

3

Un modo più semplice per leggere il corpo della richiesta è inviare a un thread di lavoro, che rende disponibile HttpExchange#getInputStream().

Ci sono due modi per farlo: utilizzando uno BlockingHandler o il modello di spedizione mostrato nello documentation. Ecco un esempio di utilizzo del BlockingHandler:

new BlockingHandler(myHandler)

Il BlockingHandler fa fondamentalmente la spedizione per voi.

0

@atok, utilizzo il metodo per un po ', ma a volte ottengo un corpo vuoto quando lo stream viene chiuso prima della chiamata di lettura. Funziona come il fascino:

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