我正在尝试使用 netty
编写一些 HTTP 应用程序。但我对这么多类似的类型感到困惑:
我想我对
netty's design philosophy
缺乏了解这背后。有人能解释一下吗?
最佳答案
当 HTTP 消息被 HttpObjectDecoder
解码时,解码器产生以下对象:
HttpRequest
或 HttpResponse
提供从初始行及其后续标题解码的属性。 HttpContent
.最后 HttpContent
是 LastHttpContent
. 典型的处理程序代码如下所示:
if (msg instanceof HttpRequest) {
...
}
if (msg instanceof HttpContent) {
...
if (msg instanceof LastHttpContent) {
...
}
}
请注意
if
块不是相互排斥的,因此当满足上述 3 个条件之一时,处理程序不会返回。看看HttpSnoopServerHandler举个具体的例子。现在,让我们看看
FullHttpRequest
.它实现了 HttpRequest
, HttpContent
, 和 LastHttpContent
.当我们插入 HttpObjectAggregator
时,编写良好的处理程序应该可以正常工作。无需更改任何代码即可进入管道。所以,这个看起来很奇怪的类层次结构的目的是让用户可以选择使用
HttpObjectAggregator
或不。但是,我同意这并不直观。我们将在 Netty 5 中以这样一种方式修复这个问题,即解码器只生成一个 HTTP 消息对象,然后将其内容流式传输到它。
关于netty - 如何使用 "HttpRequest"、 "FullHttpRequest"、 "HttpMessage"、 "FullHttpMessage"和 "LastHttpContent"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29213793/