Apache HTTP客户端或URLConnection

53

我需要在安卓应用中下载一个网页,但是我很难决定是使用安卓Apache HTTP客户端还是Java的URLConnection。

有什么想法吗?


2015年更新:自Android M起,org.apache.http类已从SDK中删除。以下是官方发布说明:http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client - Jo Jo
3个回答

45
Google自Gingerbread版本以来已经悄悄放弃了Apache HTTP客户端的使用:http://android-developers.blogspot.com/2011/09/androids-http-clients.html。虽然他们没有将其标记为过时注释,但建议您在新应用程序中使用HttpURLConnection,因为它是“我们(Google)未来将要投入精力的地方” 个人不喜欢这个决定,宁愿坚持使用HttpClient 4.1+,因为它更快,不存在那么多错误,而且会定期更新。虽然您无法将系统库升级到4.1版本,但可以将HttpClient jar包含到Android项目中(作为附加好处,这样可以使您不依赖于Google的错误修复和供应商更新)。然而,有一个缺陷:为了防止与内置库可能发生碰撞,您应该使用JarJar工具重命名httpclient包。结果,有人已经做到了这一点(重新打包的jar和Android库项目可供下载): http://code.google.com/p/httpclientandroidlib/ 这是将HttpClient 4.1重新打包为Android的版本。Android SDK中的HttpClient版本为4.0beta2。HttpClient已经进行了几次更新,进行了一些必要的错误修复,例如身份验证缓存。由于Google已将HttpClient标记为过时,支持Java标准HttpURLConnection,因此我创建了一个脚本来将Apache的HttpClient转换为Android库。
对原始HttpClient的更改包括:
  • 将所有包org.apache.http重命名为ch.boye.httpclientandroidlib
  • 删除所有依赖于org.ietf.*(SPNEGO身份验证)的类
  • 用android.util.Base64替换org.apache.commons.codec.binary.Base64
  • 创建一个新类HttpClientAndroidLog以替换org.apache.commons.logging

你好,我现在正在使用你的库来上传文件,使用的是MultipartEntity Builder 和 HttpEntity。但是我担心这个库是否还适用于22及以上版本的设备。 - John Ernest Guadalupe
@John 首先,这不是我的库,因为我从未为该项目做出过贡献。其次,这个答案已经有4年了,而且这个库似乎没有更新到2014年初,并且包含了在最新版本的HttpClient中修复的漏洞(请参见https://code.google.com/p/httpclientandroidlib/issues/detail?id=19)。我很快会更新我的答案,在此之前,我建议您使用以下其中之一:https://hc.apache.org/httpcomponents-client-4.5.x/android-port.html或切换到OkHttp客户端:http://square.github.io/okhttp/。 - Idolon

28
对于大多数事情,我会建议使用HttpClient。 但是,在某些情况和边缘情况下,我会退回到URLConnection。 边缘情况的示例在这里在这里 编辑 先前已经提出类似的问题:httpclient vs httpurlconnection。 我认为HttpUrlConnection可能要快一些,因为HttpClient是基于标准Java库构建的。但是,我发现编写和维护HttpClient代码更快更容易。根据下面的评论,HttpClient的核心元素已经进行了性能优化。
如果性能是主要问题,您最好编写两个客户端,一个使用每种方法,然后对它们进行基准测试。如果您这样做,请告诉我们结果。

你有没有任何想法,谁更快? - Amit Raz
2
HttpClient 4.1应该比HttpUrlConnection快得多。请参见http://wiki.apache.org/HttpComponents/HttpClient3vsHttpClient4vsHttpCore。在我的测试中,只有纯粹的HttpCore比HttpClient更快。 - ok2c
5
@Dave。已经投入了大量的精力来优化HttpCore(HttpClient基于其低级传输组件)。 特别注意确保在请求执行过程中仅创建最少量的中间垃圾。请注意,我个人参与了HttpClient的开发,因此我的意见可能存在偏见。 - ok2c
5
很遗憾,由于所谓的“兼容性要求”(唠叨...那 API 8 中被移除的 VMRuntime 呢?),Android 永远不会配备 HttpClient 4.1。个人认为他们只是不想费心将 httpclient 与您的开发保持最新状态(现在 Google 默默地决定将其弃用),但这并不改变事实 - 在 Android 上使用 HttpClient 4.1 的唯一方法是将其作为单独的 Jar 包含其中并重命名软件包以避免与内置版本发生类冲突。 - Idolon
2
我发现了一篇来自Android Dalvik团队成员的博客。它说未来最好使用HttpURLConnection。http://android-developers.blogspot.com/2011/09/androids-http-clients.html - leafartist
显示剩余2条评论

14

从Gingerbread版本开始,使用HttpURLConnection是正确的选择,考虑到Apache HttpClient已经被弃用。(同时请注意,Android未使用HttpClient 4.1,即另一条评论中提到的版本)。

如果你发现Apache HttpClient更快,请在这里报告bug:http://code.google.com/p/android/issues/list


1
真的吗?为什么?你们在哪里宣布了这个消息?我认为大家普遍认为Apache HttpClient是更好的API。 - Christopher Orr
8
Hughes表示:在上一届 I/O 大会上,Google 告诉我们应该使用 HttpClient 而不是 HttpUrlConnection。而且据我所知,HttpURLConnection 也是通过 HttpClient 实现的。这是非常重要的,如果 Google 确实希望我们朝这个方向发展,那么我们应该将这个信息公开化宣传一下。 - CommonsWare
2
@CommonsWare 最近在这里宣布:http://android-developers.blogspot.com/2011/09/androids-http-clients.html。 [HttpClient] 实现是稳定的,但是其庞大的 API 大大增加了我们在不破坏兼容性的情况下改进它的难度。Android 团队并没有积极地在 Apache HTTP Client 上工作。天哪,我还记得 Oleg 如何试图与 Android 团队同步进一步的项目开发。而现在他们决定弃用 HttpClient,这真是太可惜了。 - Idolon
1
@Idolon:HttpClient并没有被弃用;他们只是不积极尝试改进它。 - CommonsWare
2
如果您发现Apache HttpClient更快的情况,请在此处报告它作为一个错误 :) - kiranpradeep
HttpClient 可以进行流式加载,而 HttpUrlConnection 通常会将其加载到内存中,除非您使用 setChunkedStreamingMode,希望您连接的服务器支持。 - Archimedes Trajano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接