2014-10-05 21 views
7

Şimdi kullanıyorum kodu:Bir Handler'da POST istek gövdesi nasıl düzgün okunur?

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

Tamam iş gibi görünüyor ama ben havuza dönmeden önce clear() ByteBuffer gereği konusunda emin değilim. exchange.getConnection().getBufferPool().allocate();'u kullanma konusunda emin değilim. Dokümantasyonda fazla bir şey yok.

cevap

3

İstek gövdesini okumak için daha basit bir yol, HttpExchange#getInputStream() numarasını sağlayan bir çalışan iş parçacığına göndermektir.

Bunu yapmanın iki yolu vardır: BlockingHandler kullanarak veya documentation'da gösterilen gönderme deseni. İşte BlockingHandler kullanmanın bir örnek:

new BlockingHandler(myHandler)

BlockingHandler temelde sizin için sevkini yapar.

0

@atok, Metodunuzu bir süreliğine kullanıyorum, ancak bazen de okuma kapatılmadan önce akış kapatıldığında boş bir gövde alıyorum. Bu, çekicilik gibi çalışır:

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(); 
İlgili konular