从 Netty 中的 FullHttpResponse byteBuf 获取字符串内容

Posted

技术标签:

【中文标题】从 Netty 中的 FullHttpResponse byteBuf 获取字符串内容【英文标题】:getting string content from FullHttpResponse byteBuf in Netty 【发布时间】:2019-04-04 07:25:03 【问题描述】:

我尝试了各种口味,但都给出了乱七八糟的结果。 但是浏览器上的响应看起来不错。 (干净的json字符串)

    FullHttpResponse response = (FullHttpResponse) msg;
    byte[] bytes = new byte[response.content().readableBytes()];
    response.content().readBytes(bytes);
    String result = new String(bytes);

我按照建议here尝试的另一个是

response.content().toString(CharsetUtil.UTF_8);

两者都是这样的胡言乱语

P.S:我在管道中使用 HttpObjectAggregator 和 HttpServerCodec

【问题讨论】:

【参考方案1】:

您最有可能查看压缩数据,因为您正在处理FullHttpResponse 的实例,并且现在大多数服务器都使用压缩,因此您的数据很可能已被压缩。

要查看压缩背后的压缩算法,您应该查看response.headers().get(HttpHeaders.Names.CONTENT_ENCODING)

这可以返回不同值的组合(在多个记录的情况下以, 分隔):

gzip: 数据使用 GZip 压缩 `deflate:使用deflate压缩数据 identity: 没有进行压缩 br: 数据是用brotli压缩的

使用FullHttpResponse 的一个优点是您不必担心使用中的传输编码,因为它会为您处理。

【讨论】:

您能对此发表看法吗? ***.com/questions/55600097/… 当我尝试获取压缩算法时,我只会得到 null 作为响应,即使你知道那不是真的。使用 littleproxy-mitm。 @MrKrisey 你能打印传输编码吗,代理和其他东西的某些组合使用该标头 谢谢。这解决了问题。另一个问题:我使用 FullHttpResponse 但内容仍然是压缩的。这不是您所说的 FullHttpResponse 的优势吗?

以上是关于从 Netty 中的 FullHttpResponse byteBuf 获取字符串内容的主要内容,如果未能解决你的问题,请参考以下文章

Netty系列之:netty中的ByteBuf详解

netty系列之:netty中的frame解码器

netty系列之:netty中的自动解码器ReplayingDecoder

超详细解释从Java NIO到Netty的每一步

Netty中的零拷贝是怎么实现的?

netty系列之:protobuf在UDP协议中的使用