安卓应用的HTTP请求方式:Apache HTTP Client和HttpURLConnection

Posted 最棒程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓应用的HTTP请求方式:Apache HTTP Client和HttpURLConnection相关的知识,希望对你有一定的参考价值。

android平台上的大多数联网应用都使用HTTP来发送和接收数据。Android平台包括两种HTTP client:HttpURLConnection和Apache HTTP Client。两者都支持HTTPS、流上传/下载、超时时间设置、IPV6及连接池。

Apache HTTP Client

  DefaultHttpClient及 AndroidHttpClient都是针对Web浏览器的可扩展的HTTP clients。它们拥有数量庞大大且灵活的API,而且它们的实现都比较稳定,但是都有一些bug。

  不过,由于它们数量庞大的API导致我们无法在不破坏它们兼容性的情况下改进它们。所以Android开发团队并不热衷于Apache HTTP Client。

HttpURLConnection

  HttpURLConnection是一个针对一般用途的轻量级的HTTP client,并适用于大多数Android应用。这个类有一个比较低调的开始,不过它特别关注的那些API使我们可以简单、稳定的改进它。

  在Froyo(Android2.2)版本之前,HttpURLConnection有一些让人十分沮丧的bugs。特别是当我们在一个可读的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(Android2.3)中,我们新增了透明的相应压缩(原文是:we added transparent response compression.哪位大神知道正确翻译是啥的话,帮忙提醒下 -。-)。HttpURLConnection 会自动在它发出的请求中添加一个header,并且会处理对应的响应。

 Accept-Encoding: gzip

  你可以通过配置你的Web服务器来压缩返回给客户端的响应,从而利用该新特性。如果压缩后的响应有异常,可以在这个类的api文档中查看如何禁用该特性。

  尽管HTTP的Content-Length头中返回了压缩后的大小,但是使用getContentLength()的返回值来设定那些未压缩数据的buffer是一个错误。因此,我们应该从响应中读取每一个字节直到InputStream.read()返回-1。

 在Ice Cream Sandwich(Android4.0)中,我们正在添加一个response cache。应用这个特性,HTTP请求会以下列三种情况被响应:
  1、完全缓存的响应,直接从本地获取。这种状况下完全不需要联网,并且可以立即响应。
  2、有条件的被缓存的响应,这些缓存是否需要刷新需要从服务器确认。客户端发送一个类似“昨天以来,如果foo.png发生过变动,就给我一个新的”这样的请求,服务器会返回一个新的图片或者一个304 Not Modified状态吗给客户端。假如请求的内容没有变动,则内容不会被再次下载。
  3、没有缓存的响应,从服务器获取。这种响应会被缓存起来以备以后使用。

  可以通过反射来开启那些支持缓存HTTP响应的设备上的缓存功能。下面的代码演示了如何在不影响Ice Cream Sandwich(Android4.0)以前的版本的情况下开启缓存功能。

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响应的头中设置与缓存相关的内容。


  什么是最好的HTTP client

   在Froyo(Android2.2)及更早期的版本中,Apache HTTP client相对于HttpURLConnection 拥有更少的bug。所以这种情况下Apache HTTP clien是最好的选择。

   从Gingerbread(Android2.3)开始,HttpURLConnection则是最好的选择。它简单的API和比较小的体积使他更适合Android。Transparent compression和响应缓存则减少了网络使用,提升了加载速度和电池性能。新的应用应该使用HttpURLConnection,同时HttpURLConnection也是我们以后的工作重心所在。


以上是关于安卓应用的HTTP请求方式:Apache HTTP Client和HttpURLConnection的主要内容,如果未能解决你的问题,请参考以下文章

安卓HttpURLConnection 进行http请求(传递数据 获取数据 主线程禁止网络请求)以get方式为例

Http四种请求方式:post ,get ,put,delete

译文——OkHttp, 安卓和Java应用的HTTP&HTTP2.0客户端

Windows环境中,通过Charles工具,抓取安卓手机苹果手机中APP应用的httphttps请求包信息

httpclient发送请求的几种方式

HTTP基础与Android之(安卓与服务器通信)——使用HttpClient和HttpURLConnection