如何使用"HttpRequest"、"FullHttpRequest"、"HttpMessage"、"FullHttpMessage"和"LastHttpContent"?

How to use "HttpRequest", "FullHttpRequest", "HttpMessage", "FullHttpMessage" and "LastHttpContent"?

我正在尝试使用 netty 编写一些 HTTP 应用程序。但是我对这么多相似的类型感到困惑:

我想我对这背后的netty's design philosophy缺乏理解。

任何人都可以解释一下吗?

当 HTTP 消息被 HttpObjectDecoder 解码时,解码器产生以下 objects:

  1. HttpRequestHttpResponse 提供从初始行及其后续行解码的属性 headers。
  2. 一系列HttpContent。最后一个 HttpContentLastHttpContent.

典型的处理程序代码如下所示:

if (msg instanceof HttpRequest) {
    ...
}
if (msg instanceof HttpContent) {
    ...
    if (msg instanceof LastHttpContent) {
        ...
    }
}

请注意 if 块不是相互排斥的,因此当满足上述 3 个条件之一时,处理程序不会 return。查看 HttpSnoopServerHandler 以获取具体示例。

现在,让我们来看看FullHttpRequest。它实现了 HttpRequestHttpContentLastHttpContent。 well-written 处理程序应该在我们将 HttpObjectAggregator 插入管道而不更改任何代码的情况下正常工作。

因此,此 weird-looking class 层次结构的目的是让用户能够选择使用 HttpObjectAggregator 或不使用。

但是,我同意这不直观。我们将在 Netty 5 中以解码器仅生成单个 HTTP 消息 object 并稍后将其内容流式传输给它的方式修复此问题。