Android's HTTP Clients -Android的http客户端连接方式

柳杰
2023-12-01

【前言】开发android的手机客户端,通常都要通过模拟http请求与服务器端通信,android给我们提供了两种方式的http client客户端接口,一种是采用Apache HTTP Client,一种是采用HttpURLConnect,那么到底选择哪种方式好呢?来自google android  Dalvik team团队的Tim Bray工程师在android官方blog上的一篇文章告诉了我们答案,下面是我的翻译: 

  大多数的android app的网络连接都会使用http方式发送和接收数据,android包含了两个http客户端类库:HttpURLConnection 和Apache HTTP Client。两个都支持https,文件流上传和下载,配置超时,ipv6和连接池技术。

Apache HTTP Client

  DefaultHttpClient 以及它的兄弟类AndroidHttpClient都是适合于Web浏览器的可扩展的HTTP客户端。他们有大量灵活的api,他们的实现稳定而且很少有bug。但是,其巨大的API数量导致我们很难在不破坏兼容性的条件下来改善它,android团队对于Apache HTTP Client改善工作并不是很积极.

HttpURLConnection

  HttpURLConnection是一个通用的,轻量级的http客户端,适合大多数的应用,这个类开始比较粗糙,但是对于我们来说其一些关键的api上提高稳定性是简单的。在Froyo(2.2)以前,HttpURLConnection有一些令人沮丧的bug。特别是在一个可读的InputStream上调用close()方法可能会破坏连接池,可通过不使用连接池技术来避免这种情况。

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(2.3),我们添加了透明响应压缩技术。在HttpURLConnection会自动的添加这个头标识来发送请求,并且处理响应的结果:
Accept-Encoding: gzip
  利用这个来配置你的Web服务器,以支持返回压缩后的响应数据给客户端。如果响应压缩是有问题的,可参见类文档如何关掉它。

  因为http的Content-Length头字段返回的是压缩后的大小,所以通过调用 getContentLength() 方法来获取未压缩的缓冲数据大小是错误的。而应该从响应中读取字节直到InputStream.read()返回-1.

  在Gingerbread上我们对HTTPS还作出了一些改进。HttpsURLConnection尝试以Server Name Indication(SNI)连接, SNI允许多个HTTPS host共享一个IP地址。HttpsURLConnection还具备压缩和会话ticket功能。没有这些功能,一旦连接失败,它会自动重试。这使得HttpsURLConnection可以高效地连接到最新的服务器,同时不破坏对旧服务器的兼容性。

  在Ice Cream Sandwich(2.4 ),我们增加了响应缓存cache。当缓存cache生效后,HTTP 请求将会以下面三种方式之一处理:
(1)全缓存响应将直接从本地存储中获取。因为不需要网络连接导致响应可以立即获到。
(2)有条件的缓存响应必须在Web服务器做一下刷新验证。客户端发送一个请求,比如“Give me /foo.png if it changed  since yesterday” , 服务端的响应要么是更新后的内容,要么是304 没有修改的状态码。如果内容是没有改变,就不需要下载了。
(3)没有缓存的响应将从服务器上获取。这些响应之后将存储在响应cache中。

  可以使用”反射“(reflection)机制来使Http响应缓存功能在支持的设备上运行。以下示例代码将会在Ice Cream Sandwich上打开响应缓存功能而不影响到早期的版本:

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) {
    }
}
当然,你也应该配置你的Web服务器,在其Http响应中设置cache头字段。

哪一个更好呢?

  Apache HTTP client在Eclair(2.1)和Froyo(2.2)上bug很少,在这些版本上使用是最好的选择。
在Gingerbread(2.3)系统及以后,HttpURLConnection将是最佳选择。其API简单而且小巧,非常适合于Android。透明压缩及响应缓存机制减少了网络流量,提升网络速度,节省电池电量。 新的应用将应该使用HttpURLConnection, 它是我们Android团队致力于前进的方向!

译自:http://android-developers.blogspot.com/2011/09/androids-http-clients.html

 类似资料: