使用Apache的HttpCore + HttpNIO在Android上进行HTTP流水线操作?

时间:2011-09-20 03:39:01

标签: android httpclient pipelining

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

Apache NIO extensions docs对流水线有一个模糊的引用,提到“非阻塞HTTP连接[完全可以流水线化”],并且HttpClient代码上有a bug提到了流水线支持,但是没有提到如何实现它。

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

1 个答案:

答案 0 :(得分:3)

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

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

希望这有帮助

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