多语言展示
当前在线:1483今日阅读:113今日分享:31

HttpClient 和 HttpUrlConnection 区别

相信大家在开发 Android 应用程序的时候,或多或少都会用到网络请求,在创建网络请求的时候,你也许会用 HttpClient 或者HttpUrlConnection 或者其他的网络请求框架,但是无论你用哪种方式创建网络请求,最终请求的执行者都是这两者中的一个。既然两个都可以创建网络请求对象,那么二者究竟有什么区别呢?接下来,我们就看看资深的 Google Developer 是怎么说的?
方法/步骤
1

下面开始正文:多数的网络链接应用都会用 HTTP 去发送数据和接收数据。Android 包含了两个客户端:HttpURLConnection 和 Apache HTTP Client。两种客户端都支持:Https、文件流上传/下载、超时、IPv6 和连接池。

2

Apache HTTP ClientDefaultHttpClient 和 AndroidHttpClient 都非常适合 Web 浏览器。他们拥有丰富并且灵活的 API。他们的实现方式都很好,并且几乎没有 Bug。 但是由于他们拥有大量的 API,所以在不打破原有兼容性的情况下,是很难扩展的。因此,Android 开发团队在 Apache HTTP Client 的开发上表现的不积极。

3

HttpURLConnectionHttpURLConnection 相对于上面提到的 Apache HTTP Client 显得更通用、更轻量级。这个类有一个非常卑微的开始,但是集中的 API 使得它更容易被扩展。 在 Froyo 版本之前,HttpURLConnection 有一个令人沮丧的 Bug。 尤其在关闭输入流时,可能导致连接池混乱。通过“关掉连接池”就可以避开这个Bug:private void disableConnectionReuseIfNecessary() {    // HTTP connection reuse which was buggy pre-froyo    if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {        System.setProperty('http.keepAlive', 'false');    } }private void disableConnectionReuseIfNecessary() {    // HTTP connection reuse which was buggy pre-froyo    if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {        System.setProperty('http.keepAlive', 'false');    } }在 Gingerbread 版本中,我们加入了压缩响应。HttpURLConnection 将会自动为发送的请求添加 header,并且处理相应的响应:Accept-Encoding: gzip1为了利用这一特性,你必须在服务器做相应的配置。如果你的压缩响应(安卓端)有问题,请点击这里查看屏蔽此功能的方法。自从通过 Content-Length header 属性返回文件压缩尺寸之后,通过 getContentLength() 函数去分配缓冲池的大小已经不能正确的工作了。取而代之的是:从响应里读取数据,直到返回-1。当然,除此之外,我们还在 Gingerbread 版本中,做了其他的改进。 HttpsURLConnection 尝试去连接 SNI( which allows multiple HTTPS hosts to share an IP address)。HttpsURLConnection 还支持压缩和事务。当链接失败的时候,它会重新尝试。在 Ice Cream Sandwich 版本中,我们加入了缓存。在缓存安装之后,Http 请求将会满足以下三种条件之一:Fully cache 将由本地存储来实现。因为在没有网络的时候,需要这样的响应结果。Conditionally cache 将由服务器验证是否需要更新数据。客户端发送一个“如果这些数据改变了,那么给我最新的数据”请求,服务器在接收到这个请求的之后,返回最新的数据或者返回304(Not Modified status)。如果数据没有改变,那么,数据将不会被下载。Uncached 服务器没有缓存。在这个请求之后这个响应将会被缓存。利用反射使 Http 请求结果缓存在机器上。这一段示例代码将会在不影响之前功能的情况下,打开“响应结果缓存”的功能。private void enableHttpResponseCache() {    try {        long httpCacheSize = 10 * 1024 * 1024; // 10 MiB        File httpCacheDir = new File(getCacheDir(), 'http');        Class.forName('android.net.http.HttpResponseCache')            .getMethod('install', File.class, long.class)            .invoke(null, httpCacheDir, httpCacheSize);    } catch (Exception httpResponseCacheNotAvailable) {    } }private void enableHttpResponseCache() {    try {        long httpCacheSize = 10 * 1024 * 1024; // 10 MiB        File httpCacheDir = new File(getCacheDir(), 'http');        Class.forName('android.net.http.HttpResponseCache')            .getMethod('install', File.class, long.class)            .invoke(null, httpCacheDir, httpCacheSize);    } catch (Exception httpResponseCacheNotAvailable) {    } }与此同时,你应该在服务器端配置响应结果的 “cache header” 属性。

4

Which client is best?Apache HTTP client 在 Eclair 和 Froyo 版本中,拥有更少的Bug,因此在这些版本中使用这些功能是最好的选择。对于 Gingerbread 和后来的一些版本,HttpURLConnection 是最好的选择。因为它拥有更简单的 API,并且更轻量级。透明的压缩和缓存减少了网络请求的次数,提高了请求的响应速度,并且更省电了。 因此最新的 Android 应用,应该使用 HttpURLConnection ;我们将会花更多地精力在HttpURLConnection 上。(New applications should use HttpURLConnection; it is where we will be spending our energy going forward.)通过最后一句,我相信,小伙伴们应该都知道在后面的开发中,该怎么使用 HttpClient 和 HttpUrlConnection 了。

推荐信息