4

Android 使用 Apache 的 HTTP 组件库来执行 HTTP 请求并公开一个不支持异步请求或流水线的 API。我们正在编写一个可以从流水线中受益的应用程序,因此我们使用Hotpotato来执行这些请求。为了减小 APK 的大小(Hotpotato 和 Netty 使 APK 大小增加了 ~2-4MB),我们希望在 HttpCore 和 HttpNIO 之上实现我们自己的。

Apache NIO 扩展文档对流水线有一个模糊的引用,提到“非阻塞 HTTP 连接 [是] 完全支持流水线的”,并且 HttpClient 代码中有一个错误提到了流水线支持,但没有提到如何实现它.

如何使用 Apache 的 HTTP 组件在 Android 现有的 Apache HTTP 组件库之上实现对 HTTP 管道和持久连接的支持?

4

1 回答 1

3

很可能你不会喜欢这个答案,但就这样吧。缺乏对 HTTP 流水线的支持的原因是 HTTP 流水线在非常有限的用例之外根本没有用处。HTTP 流水线仅适用于(或由 HTTP 规范推荐)非幂等 HTTP 方法。这有效地排除了 POST 请求的流水线。对于需要使用 GET 请求检索大量静态文件但仅限于两个到同一主机的同时 HTTP 连接。在这种情况下,HTTP 流水线可能会产生微小的性能改进。同时,我认为使用中等大小的持久连接池(不超过五个)的 HTTP 代理将优于流水线 HTTP 代理。HTTP 流水线的额外复杂性根本不值得麻烦,这就是为什么没有迫切需要为 HttpClient 和 HttpCore 添加对 HTTP 流水线的开箱即用支持的原因。

话虽如此,HttpCore NIO 的所有非阻塞 HTTP 连接都是完全异步的,并且始终以全双工模式运行。HttpCore 对可以写入多少请求或一次可以接收多少响应没有任何限制。协议处理程序负责将 HTTP 请求和响应关联到逻辑相关的消息交换序列中。标准 HTTP 协议处理程序不会对 HTTP 消息进行管道传输,以便能够支持 POST 请求的预期继续握手(预期验证和管道传输几乎是相互排斥的)。但是,没有什么可以阻止您构建自定义NHttpClientHandler类并使其成为管道请求。您可以从获取 HttpAsyncClientProtocolHandler [1] 的源代码开始,删除期望继续握手代码并添加传入和传出 HTTP 消息的队列。

希望这可以帮助

[1] http://svn.apache.org/repos/asf/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncClientProtocolHandler.java

于 2011-09-25T10:37:33.213 回答