如何在Netty中的HTTP POST中读取消息正文(版本> = 4.x)

时间:2015-03-05 03:04:24

标签: http netty nio

在我的服务器处理程序中; - channelRead()总是将msg作为HTTPRequest获取,在那里我找不到任何获取POST请求有效负载的地方。

  • 然后我尝试在我的处理程序中检查它是否有效。解码器有0个元素。

HttpPostRequestDecoder decoder = new HttpPostRequestDecoder(new DefaultHttpDataFactory(false),request);

在我的服务器管道中,我只有HttpServerCodec和自定义处理程序。

2 个答案:

答案 0 :(得分:5)

您的HTTP请求可能会被分块。您应该尝试在编解码器之后向管道添加io.netty.handler.codec.http.HttpObjectAggregator。它将为您的处理程序提供FullHttpRequest。

 ChannelPipeline p = ...;
 ...
 p.addLast("encoder", new HttpResponseEncoder());
 p.addLast("decoder", new HttpRequestDecoder());
 p.addLast("aggregator", new HttpObjectAggregator(1048576));
 ...
 p.addLast("handler", new MyServerHandler());

或者,您可以选中this exampleHttpRequestHttpContent分别处理。

答案 1 :(得分:1)

正如Leo Gomes所说,HTTP请求可能会被分块。所以在你自己的管道处理程序之前添加HttpObjectAggregator。 如果HTTP POST请求体是Simple Json String。您可以在自己的处理程序中解析它,如下所示:

                var reportData = (from C in Table1
                                  join LC in Table2 on C.Id equals LC.Id
                                  select new { C.Id, C.User, LC.Phy, LC.Che, LC.Bio, LC.Math }).ToList();

                foreach (var item in reportData)
                {

                    lstLc.Add(new Launch() { Username= item.User, Phy = item.Phy, Che = item.Che, Bio = item.Bio, Math = item.Math });
        }