我现在使用的代码:
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();
。文档中没有太多关于它的内容。
答案 0 :(得分:4)
读取请求主体的一种更简单的方法是调度到工作线程,这使得HttpExchange#getInputStream()
可用。
有两种方法可以执行此操作:使用BlockingHandler
或documentation中显示的调度模式。以下是使用BlockingHandler
:
new BlockingHandler(myHandler)
BlockingHandler
基本上是为你派遣的。
答案 1 :(得分:3)
要以非阻塞方式进行操作,请参见io.undertow.io.Receiver
界面。
处理程序的示例可能是:
pathHandler.put("/test", new HttpHandler() {
@Override
public void handleRequest(HttpServerExchange exchange) throws Exception {
exchange.getRequestReceiver().receiveFullBytes(new FullBytesCallback() {
@Override
public void handle(HttpServerExchange exchange, byte[] message) {
System.out.println(new String(message));
}
});
exchange.getResponseSender().send("Hello World");
}
});
或对于Java 8:
pathHandler.put("/test", (ex) -> {
ex.getRequestReceiver().receiveFullBytes((e, m) -> {
System.out.println(new String(m));
});
ex.getResponseSender().send("Hello World");
});
答案 2 :(得分:2)
@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( );
答案 3 :(得分:0)
<style>
dd {
min-width: 120px !important;
background: #dd0 !important;
}
dt {
float: left;
background: #cc0 !important;
text-align: left !important;
}
</style>