如何解码Java中的http POST数据?

时间:2011-12-28 18:03:06

标签: java http post netty

我正在使用Netty,我必须接受并解析http POST请求。据我所知,Netty没有内置的POST支持,只有GET。 (这是一个处理原始网络操作的相当低级的库。使用servlet容器,它可以完成所有这些开箱即用的功能。)

如果我将POST请求的内容作为字节数组,那么将它解析为参数Map的最快且最无错误的方法是什么?

我自己可以写这个,但是必须是JDK中内置的一些方法,这使得这更容易。而且我敢打赌,还有一些问题需要处理。

3 个答案:

答案 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