如何使用“HttpRequest”,“FullHttpRequest”,“HttpMessage”,“FullHttpMessage”和“LastHttpContent”?

时间:2015-03-23 15:13:35

标签: netty

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

  • 的HttpRequest
  • FullHttpRequest
  • HttpMessage
  • FullHttpMessage
  • 的HttpResponse
  • FullHttpResponse
  • LastHttpContent

我想我对此背后的netty's design philosophy缺乏了解。

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:14)

HttpObjectDecoder解码HTTP消息时,解码器会生成以下对象:

  1. HttpRequestHttpResponse,提供从初始行及其后续标题解码的属性。
  2. 一系列HttpContent。最后一个HttpContentLastHttpContent
  3. 典型的处理程序代码如下所示:

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

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

    现在,让我们来看看FullHttpRequest。它实现了HttpRequestHttpContentLastHttpContent。当我们将HttpObjectAggregator插入管道而不更改任何代码时,编写良好的处理程序应该正常工作。

    因此,这种看起来很奇怪的类层次结构的目的是让用户选择是否使用HttpObjectAggregator

    但是,我确实同意这不直观。我们将在Netty 5中修复此问题,使解码器只生成一个HTTP消息对象,并在以后将其内容流式传输到它。