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

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

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

    谁能给我一些启示?

    最佳答案

    通过HttpObjectDecoder解码HTTP消息时,解码器将产生以下对象:

  • 一个HttpRequestHttpResponse,提供从初始行及其后续 header 解码的属性。
  • 一系列HttpContent。最后一个HttpContentLastHttpContent

  • 典型的处理程序代码如下所示:
    if (msg instanceof HttpRequest) {
        ...
    }
    if (msg instanceof HttpContent) {
        ...
        if (msg instanceof LastHttpContent) {
            ...
        }
    }
    

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

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

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

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

    关于netty - 如何使用 "HttpRequest", "FullHttpRequest", "HttpMessage", "FullHttpMessage"和 "LastHttpContent"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29213793/

    10-09 00:46