zoukankan      html  css  js  c++  java
  • HttpURLConnection和HttpClient区别

    在Android上使用Http客户端的选择(译文)

    大多数有网络连接的Android应用会使用HTTP协议发送和接收数据。Android包含两种Http客户端类,HttpURLConnectionApache HttpClient。这两者都支持HTTPSstreaming 上传与下载,配置超时时间,IPv6, 以及连接池。

    Apache Http Client

    DefaultHttpClient 和它的兄弟类AndroidHttpClient是适用于web浏览器的可扩展的Http客户端。它们有大量的灵活的API,实现比较稳定,很少有bug。但是, 其庞大的API使我们很难去改进而不破坏其兼容性。 Android团队现在已不活跃与Apache HttpClient的工作上了。

    HttpURLConnection

    HttpURLConnection是一个可以适用于各类应用的通用轻量级的Http客户端。该类开始较为简陋,但其关注的API让我们容易平稳地改进它。 Froyo(2.2)之前,HttpURLConnection有一些令人沮丧的的bug。尤其是在一个可读的InputStream上调用close()将会阻碍连接池。为了解决这个bug只能关掉连接池。

     

    复制代码
    1  private void disableConnectionReuseIfNecessary() {
    2     // HTTP connection reuse which was buggy pre-froyo
    3     if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
    4         System.setProperty("http.keepAlive", "false");
    5     }
    6 }
    复制代码

     

    Gingerbread(2.3),我们增加了透明的回应(response)压缩。HttpURLConnection将自动地将Accept-Encoding: gzip”头字段添加到请求(request)中,并处理相应的回应。 通过更改你的Web服务器配置,实现对支持的客户端返回压缩后的数据。如果压缩出了问题, 类文档将提供关掉它的方法。

           由于HTTPContent-Length头字段返回的是压缩后的大小,使用getContentLength()去分配解压缩后数据buffer 的大小就是错误的。 应该从response中读字节直到InputStream.read()返回值为-1

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

    Ice Cream Sandwich4.0),我们增加了response cache。安装了cache后,HTTP 请求以以下三种方式之一处理:

    完全的cacheresponse将直接从本地存储中获取。因为不需要网络连接,此类response可以立即得到。

    有条件cacheresponse必须在Web服务器验证一下cache的有效性。客户端发送一个请求,比如“如果/foo.png从昨天起有变化则给我新的图片” , 服务端的response要么是更新后的内容,要么是304 没有修改状态码。如果内容是没有改变的,就不需要下载了。

    没有cacheresponse将从服务器上获取。得到这些response之后会存储到cache以便将来使用。

    使用反射机制来使用Https response cache功能。以下示例代码将会在Ice Cream Sandwich上打开response cache功能而不影响到之前的版本:

     

    复制代码
     1 private void enableHttpResponseCache() {
     2     try {
     3         long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
     4         File httpCacheDir = new File(getCacheDir(), "http");
     5         Class.forName("android.net.http.HttpResponseCache")
     6             .getMethod("install", File.classlong.class)
     7             .invoke(null, httpCacheDir, httpCacheSize);
     8     } catch (Exception httpResponseCacheNotAvailable) {
     9     }
    10 }
    复制代码

     

    当然,你也需要更改你的Web服务器配置,在其Http response中设置cache头字段。

    哪一种http客户端最好?

    Apache HTTP clientEclair(2.1)Froyo(2.2)bug更少,在这些系统版本上将是最佳选择。

           Gingerbread(2.3)起,HttpURLConnection将是最佳选择,其API简单,小巧,非常适合于Android。透明的压缩及response cache减少了网络流量,改进了网络速度,也就更省电。 新的应用将应该使用HttpURLConnection这是我们以后花费精力去探索的地方。

  • 相关阅读:
    leetcode 576. Out of Boundary Paths 、688. Knight Probability in Chessboard
    leetcode 129. Sum Root to Leaf Numbers
    leetcode 542. 01 Matrix 、663. Walls and Gates(lintcode) 、773. Sliding Puzzle 、803. Shortest Distance from All Buildings
    leetcode 402. Remove K Digits 、321. Create Maximum Number
    leetcode 139. Word Break 、140. Word Break II
    leetcode 329. Longest Increasing Path in a Matrix
    leetcode 334. Increasing Triplet Subsequence
    leetcode 403. Frog Jump
    android中webView加载H5,JS不能调用问题的解决
    通过nginx中转获取不到IP的问题解决
  • 原文地址:https://www.cnblogs.com/shipeng22022/p/4613997.html
Copyright © 2011-2022 走看看