我有一个Http客户端的以下管道配置 -
pipeline.addLast("ssl", new SslHandler());
pipeline.addLast("decoder", new HttpResponseDecoder());
pipeline.addLast("encoder", new HttpRequestEncoder());
pipeline.addLast("handler", new MySimpleChannelInboundHandler());
在MySimpleChannelInboundHandler
的{{1}}方法中,我得到channelRead0()
而不是DefaultHttpContent
的实例。当我使用 -
HttpResponse
的内容时
DefaultHttpContent
我可以看到记录的实际HTTP响应。
为什么即使我在管道中有HTTP解码器,这个HTTP响应也没有被解码为DefaultHttpContent content = (DefaultHttpContent) msg;
LOG.debug(content.content().toString(CharsetUtil.UTF_8));
对象?
谢谢!
答案 0 :(得分:0)
在enc / decoders之前使用HttpObjectAggregator
以聚合httpResponse和所有以下HttpContents。在管道中添加HttpObjectAggregator
后,您将在处理程序中获得FullHttpResponse
个对象。
例如:p.addLast("aggregator", new HttpObjectAggregator(1048576));
还有一件事,如果你没有为客户实现自己的编码/解码器,你可以提供netty的HttpClientCodec
答案 1 :(得分:0)
我遇到了问题。 HttpResponseDecoder
之前已解码对HTTP CONNECT请求的响应。我没有覆盖isContentAlwaysEmpty(HttpMessage httpMessage)
方法为CONNECT请求返回false。这使HttpResponseDecoder
处于不良状态。它期待响应中的内容,但对HTTP CONNECT的响应没有。当对下一个请求的响应到达时,它被视为内容而未被解码为HttpResponse
。
我扩展HttpResponseDecoder
并覆盖(覆盖?)isContentAlwaysEmpty(HttpMessage httpMessage)
以返回false以获取CONNECT请求并且它有效。这已记录在HttpResponseDecoder
class level documentation下的"解码CONNECT请求的响应"。