2014-10-05 4 views
7

कोड मैं अब उपयोग कर रहा हूँ:एक हैंडलर में POST अनुरोध निकाय को सही तरीके से कैसे पढ़ा जाए?

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

यह ठीक काम करने के लिए लगता है, लेकिन मैं पूल के लिए यह लौटने से पहले clear() ByteBuffer की जरूरत के बारे यकीन नहीं है। मैं exchange.getConnection().getBufferPool().allocate(); का उपयोग करने के बारे में भी निश्चित नहीं हूं। दस्तावेज में इसके बारे में बहुत कुछ नहीं है।

उत्तर

3

अनुरोध निकाय को पढ़ने का एक आसान तरीका एक कार्यकर्ता थ्रेड को प्रेषित करना है, जो HttpExchange#getInputStream() उपलब्ध कराता है।

ऐसा करने के दो तरीके हैं: BlockingHandler या documentation में दिखाए गए प्रेषण पैटर्न का उपयोग करना। यहाँ BlockingHandler का उपयोग करने का एक उदाहरण है:

new BlockingHandler(myHandler)

BlockingHandler मूल रूप से आप के लिए प्रेषण करता है।

0

@atok, मैं थोड़ी देर के लिए आपकी विधि का उपयोग करता हूं, लेकिन कभी-कभी मुझे रिक्त कॉल से पहले स्ट्रीम बंद होने पर खाली निकाय मिलता है। यह आकर्षण की तरह काम करता है:

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(); 
संबंधित मुद्दे