我正在使用Netty,我必须接受并解析http POST请求。据我所知,Netty没有内置的POST支持,只有GET。 (这是一个处理原始网络操作的相当低级的库。使用servlet容器,它可以完成所有这些开箱即用的功能。)
如果我将POST请求的内容作为字节数组,那么将它解析为参数Map的最快且最无错误的方法是什么?
我自己可以写这个,但是必须是JDK中内置的一些方法,这使得这更容易。而且我敢打赌,还有一些问题需要处理。
答案 0 :(得分:13)
Netty有一个可以解码的高级POST请求解码器(HttpPostRequestDecoder) Http Attributes,FileUpload Content with chunked encoding。
这是一个简单的表单解码示例
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
HttpRequest request = (HttpRequest) e.getMessage();
HttpPostRequestDecoder decoder = new HttpPostRequestDecoder(new DefaultHttpDataFactory(false), request);
InterfaceHttpData data = decoder.getBodyHttpData("fromField1");
if (data.getHttpDataType() == HttpDataType.Attribute) {
Attribute attribute = (Attribute) data;
String value = attribute.getValue()
System.out.println("fromField1 :" + value);
}
}
答案 1 :(得分:7)
您可以在Netty 4.x中使用HttpPostRequestDecoder。它支持各种POST机身。 Netty 4.x目前被标记为alpha,但非常稳定。请参阅Xitrum中的BodyParser。
如果你只需要解析简单的主体,你仍然可以在Netty 3.x中使用QueryStringDecoder来处理POST主体,就像“?”之后的部分一样。在URL中,像这样:
QueryStringDecoder decoder = new QueryStringDecoder("?" +
request.getContent.toString(org.jboss.netty.util.CharsetUtil.UTF_8));
答案 2 :(得分:3)
您使用的是哪个版本的netty? Netty的HttpRequest支持POST方法。 不知道任何库可以解析字节来映射params。这通常是servlet容器的作用。看一下tomcat的源代码,了解他们如何实现processParameters()方法http://svn.apache.org/repos/asf/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/Parameters.java