安卓应用的HTTP请求方式:Apache HTTP Client和HttpURLConnection
来源:互联网 发布:淘宝qs工业生产许可证 编辑:程序博客网 时间:2024/06/03 11:16
原文链接:Android’s HTTP Clients
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。
在Gingerbread(Android2.3)中,我们还针对HTTPS做了一些提升。HttpURLConnection尝试与 Server Name Indication (SNI)进行互联,这是一种允许多个HTTPS host共享一个IP地址的技术。同时还使用压缩及session tickets。假如HttpURLConnection连接失败,HttpURLConnection会去掉以上特性后自动尝试重新连接。这使得HttpURLConnection在不破坏与旧的server兼容性的情况下,连接up-to-date servers更高效。
在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
- Android HTTP请求方式:HttpURLConnection
- [Android] HttpURLConnection or Apache Http client
- 使用HttpUrlConnection取代Apache Http Client
- 封装的Http请求(HttpURLConnection和okHttp)
- 关于安卓HTTP请求用HttpUrlConnection还是HttpClient好
- 关于安卓HTTP请求用HttpUrlConnection还是HttpClient好
- 关于安卓HTTP请求用HttpUrlConnection还是HttpClient好
- 关于安卓HTTP请求用HttpUrlConnection还是HttpClient好
- 关于安卓HTTP请求用HttpUrlConnection还是HttpClient好
- 关于安卓HTTP请求用HttpUrlConnection还是HttpClient好
- 关于安卓HTTP请求用HttpUrlConnection还是HttpClient好
- Android 6.0 的 SDK不再支持 Apache HTTP client而改用HttpURLConnection
- httpURLConnection发送http请求
- http请求之HttpURLConnection
- HTTP访问的两种方式(HttpClient和HttpURLConnection)
- HTTP访问的两种方式(HttpClient和HttpURLConnection)
- HTTP访问的两种方式(HttpClient和HttpURLConnection)
- 复制构造函数
- 分类的简化版本
- JavaScript学习笔记:docuemnt.write实现输出内容
- liunx采用cmd
- 参数不能是“美分”
- 安卓应用的HTTP请求方式:Apache HTTP Client和HttpURLConnection
- 理解hibernate的session缓存机制(一级缓存和二级缓存)
- 玩转extjs5之extjs初识(一)
- 一个无限批量下载百度美女图片的demo
- SQL:列的拆分
- UVA11019 Matrix Matcher(一种计算子矩阵在母矩阵中出现次数的办法,AC自动机+kmp)
- 关于css优先级
- hibernate列名无效
- sql server linkserve连接到oracle