如何使用"HttpRequest"、"FullHttpRequest"、"HttpMessage"、"FullHttpMessage"和"LastHttpContent"?
How to use "HttpRequest", "FullHttpRequest", "HttpMessage", "FullHttpMessage" and "LastHttpContent"?
我正在尝试使用 netty
编写一些 HTTP 应用程序。但是我对这么多相似的类型感到困惑:
- HttpRequest
- FullHttpRequest
- HttpMessage
- FullHttpMessage
- HttpResponse
- FullHttpResponse
- LastHttpContent
我想我对这背后的netty's design philosophy
缺乏理解。
任何人都可以解释一下吗?
当 HTTP 消息被 HttpObjectDecoder
解码时,解码器产生以下 objects:
HttpRequest
或 HttpResponse
提供从初始行及其后续行解码的属性 headers。
- 一系列
HttpContent
。最后一个 HttpContent
是 LastHttpContent
.
典型的处理程序代码如下所示:
if (msg instanceof HttpRequest) {
...
}
if (msg instanceof HttpContent) {
...
if (msg instanceof LastHttpContent) {
...
}
}
请注意 if
块不是相互排斥的,因此当满足上述 3 个条件之一时,处理程序不会 return。查看 HttpSnoopServerHandler 以获取具体示例。
现在,让我们来看看FullHttpRequest
。它实现了 HttpRequest
、HttpContent
和 LastHttpContent
。 well-written 处理程序应该在我们将 HttpObjectAggregator
插入管道而不更改任何代码的情况下正常工作。
因此,此 weird-looking class 层次结构的目的是让用户能够选择使用 HttpObjectAggregator
或不使用。
但是,我同意这不直观。我们将在 Netty 5 中以解码器仅生成单个 HTTP 消息 object 并稍后将其内容流式传输给它的方式修复此问题。
我正在尝试使用 netty
编写一些 HTTP 应用程序。但是我对这么多相似的类型感到困惑:
- HttpRequest
- FullHttpRequest
- HttpMessage
- FullHttpMessage
- HttpResponse
- FullHttpResponse
- LastHttpContent
我想我对这背后的netty's design philosophy
缺乏理解。
任何人都可以解释一下吗?
当 HTTP 消息被 HttpObjectDecoder
解码时,解码器产生以下 objects:
HttpRequest
或HttpResponse
提供从初始行及其后续行解码的属性 headers。- 一系列
HttpContent
。最后一个HttpContent
是LastHttpContent
.
典型的处理程序代码如下所示:
if (msg instanceof HttpRequest) {
...
}
if (msg instanceof HttpContent) {
...
if (msg instanceof LastHttpContent) {
...
}
}
请注意 if
块不是相互排斥的,因此当满足上述 3 个条件之一时,处理程序不会 return。查看 HttpSnoopServerHandler 以获取具体示例。
现在,让我们来看看FullHttpRequest
。它实现了 HttpRequest
、HttpContent
和 LastHttpContent
。 well-written 处理程序应该在我们将 HttpObjectAggregator
插入管道而不更改任何代码的情况下正常工作。
因此,此 weird-looking class 层次结构的目的是让用户能够选择使用 HttpObjectAggregator
或不使用。
但是,我同意这不直观。我们将在 Netty 5 中以解码器仅生成单个 HTTP 消息 object 并稍后将其内容流式传输给它的方式修复此问题。