Android中对HTTP的支持:
在Android中想要使用HTTP协议访问服务器有很多种选择, 包括:
l HttpClient: 来自Apache的项目, 是Android中很常用的HTTP库.
l HttpURLConnection: 来自java.net.HttpURLConnection.
l Volley: Google出的HTTP库.
以及其它第三方的一些库:
l OkHttp: 是一个现代, 快速, 高效的Http client, 支持HTTP/2以及SPDY, 扮演着传输层的角色.
l XUtils:
l Android-async-http等.
HttpClient:
HttpClient是Apache JakartaCommon下的子项目, 用来提供高效的最新的功能丰富的支持HTTP协议的客户端编程工具包, 并且它支持HTTP协议最新的版本和建议. HttpClient已经应用在很多的项目中, 比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient. 但是在目前最新的Android 6.0版本中, 该库已经被移除出Android SDK.
功能特性:
1. 基于标准纯净的java语言.实现了Http1.0和Http1.1
2. 以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE).
3. 支持HTTPS协议.
4. 通过Http代理建立透明的连接.
5. 利用CONNECT方法通过Http代理建立隧道的https连接.
6. Basic, Digest, NTLMv1, NTLMv2,NTLM2 Session, SNPNEGO/Kerberos认证方案.
7. 插件式的自定义认证方案.
8. 便携可靠的套接字工厂使它更容易的使用第三方解决方案.
9. 连接管理器支持多线程应用. 支持设置最大连接数, 同时支持设置每个主机的最大连接数, 发现并关闭过期的连接.
10. 自动处理Set-Cookie中的Cookie.
11. 插件式的自定义Cookie策略.
12. Request的输出流可以避免流中内容直接缓冲到socket服务器.
13. Response的输入流可以有效的从socket服务器直接读取相应内容.
14. 在http1.0和http1.1中利用KeepAlive保持持久连接.
15. 直接获取服务器发送的response code和 headers.
16. 设置连接超时的能力.
17. 实验性的支持http1.1 response caching.
18. 源代码基于Apache License 可免费获取.
符合的标准: HTTPClient努力的确保符合由Internet Engineering Task Force(IETF)制定的标准:
l RFC 1945 Hypertext Transfer Protocol -- HTTP/1.0
l RFC 2616 Hypertext Transfer Protocol -- HTTP/1.1
l RFC 2617 HTTP Authentication: Basic and Digest Access Authentication
l RFC 6265 HTTP State Management Mechanism (Cookies)
关于该库的使用可以参考这里.
HttpURLConnection:
HttpURLConnection是一种多用途轻量极的HTTP客户端, 使用它来进行HTTP操作可以适用于大多数的应用程序. 虽然HttpURLConnection的API提供的比较简单, 但是同时这也使得我们可以更加容易地去使用和扩展它.
不过在Android 2.2版本之前, HttpURLConnection一直存在着一些令人厌烦的bug. 比如说对一个可读的InputStream调用close()方法时, 就有可能会导致连接池失效了. 那么我们通常的解决办法就是直接禁用掉连接池的功能:
private voiddisableConnectionReuseIfNecessary() {
// 这是一个2.2版本之前的bug
if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO){
System.setProperty("http.keepAlive", "false");
}
}
在Android 2.3版本的时候, 加入了更加透明化的响应压缩. HttpURLConnection会自动在每个发出的请求中加入如下消息头, 并处理相应的返回结果: Accept-Encoding: gzip
HttpClient和HttpURLConnection选择:
在Android 2.2版本之前,HttpClient拥有较少的bug, 因此使用它是最好的选择. 在最新的Android 6.0版本中, HttpClient已经从Android SDK中移除了. 官方不再推荐使用该库.
而在Android 2.3版本及以后,HttpURLConnection则是最佳的选择. 它的API简单, 体积较小, 因而非常适用于Android项目. 压缩和缓存机制可以有效地减少网络访问的流量, 在提升速度和省电方面也起到了较大的作用. 对于新的应用程序应该更加偏向于使用HttpURLConnection. 并且官方也会侧重优化HttpURLConnection.
Volley:
Volley是一个很简单迅捷的HTTP库. 它可以通过AOSP(AndroidOpen-Source Project)获取. 是Google官方开发的HTTP库. Volley有这些优点:
l 自动调度网络请求.
l 多并发网络连接.
l 透明的硬盘和内存响应缓存,符合标准HTTP缓存要求.
l 支持请求优先级.
l 取消请求API. 你可以取消一个单独的请求,或者你可以设置块或者范围性的请求取消.
l 简化定制, 比如重试和后退.
l 强大的排序功能, 可以让你从网络中获取的数据正确的填充到UI界面中.
l 支持调试和打印工具.
Volley擅长处理RPC类的操作, 并用于填充UI, 比如抓取页面或者搜索结果作为结构化数据. 它可以方便的跟任何协议集成, 并十分便捷的支持原始字符串, 图片和JSON. 通过内置的支持那些你需要的功能, Volley可以让你从繁琐的模板代码中解脱出来并聚焦于实现APP的逻辑.
Volley不适合用于大文件下载或者流操作, 因为Volley在解析的时候会将所有的数据都保存在内存中. 对于大文件的下载操作, 考虑使用其它方案来替代, 比如DownloadManager.
Volley在Android 2.2及之前的版本中使用HTTPClient作为其传输层, 而在Android 2.3及其版本之后则使用HttpURLConnection作为其传输层. 原因是这两种http库在不同版本中各存在一些问题. Volley还可以轻松的设置下面要介绍的OKHttp作为其传输层.
OKHttp:
OkHttp是一个快速高效的Http client, 支持HTTP/2以及SPDY, 它为你做了很多事情, 纵观OkHttp实现的诸多技术如连接池, gziping,缓存就知道网络相关的操作是多么复杂了. OkHttp扮演者传输层的角色. OkHttp使用Okio来大大简化数据的访问与存储, Okio是一个增强的java.io和java.nio的库, 它和OkHttp都是Square团队开发的. OkHttp可以支持:
l HTTP/2的支持让所有的到同一个host的请求都共享一个socket.
l 连接池减少了请求的延迟(如果HTTP/2不可用的话).
l 透明的GZIP缩小了下载的大小.
l 响应缓存避免了网络的完整重复请求.
OkHttp在网络连接不通畅的时候依然很高效, 它可以悄悄的从常见的连接问题中恢复. 如果你的服务拥有多个IP地址, 在第一个地址连接失败的情况下OkHttp将会尝试改变地址. 这在IPv4+IPv6和拥有冗余数据服务器的情况下都很有用. OkHttp使用先进的TLS功能(SNI, ALPN)初始化一个新的连接, 如果握手失败则会回退到TLS 1.0.
OkHttp的使用十分的简单, 它可以支持同步阻塞调用和通过回调返回结果的异步调用. OkHttp可以支持Android 2.3及更高版本, 最小的可以支持的Java版本是1.7.
xUtils:
这是个国产的框架, 它本身有四个模块, 可以支持数据库, UI, Http, 和Bitmap. 其中HttpUtils模块是用于支持HTTP的. 它有以下特点:
l 支持同步, 异步方式的请求;
l 支持大文件上传, 上传大文件不会oom;
l 支持GET, POST, PUT,MOVE, COPY, DELETE, HEAD, OPTIONS, TRACE, CONNECT请求;
l 下载支持301/302重定向, 支持设置是否根据Content-Disposition重命名下载的文件;
l 返回文本内容的请求(默认只启用了GET请求)支持缓存, 可设置默认过期时间和针对当前请求的过期时间.
Android-async-http:
该库是基于HttpClient库实现的. 所有的请求都在UI线程之外实现, 但是任何的回调逻辑将在创建回调的线程中执行, 并通过Handler消息传递. 还可以在Service或者后台线程中使用, 库将会自动识别自己所在的上下文.
功能特性:
l 使用的是4.3.6版本的HttpClient而不是Android提供的DefaultHttpClient.
l 兼容Android API23及更高.
l 使用异步HTTP请求, 在匿名回调中处理响应.
l HTTP请求在UI线程之外.
l 使用线程池来发送请求.
l GET/POST参数builder(RequestParams).
l 分段文件上传而不用第三方支持库.
l 流传输JSON上传, 而不用额外的第三方库.
l 处理循环和相对重定向.
l 对APP而言开销较小, 只要90kb就可以搞定一切.
l 自动gzip响应解码支持.
l 使用BinaryHttpResponseHandler支持二进制协议通信.
l 使用内置的JsonHttpResponseHandler来解析JSON.
l 使用FileAsyncHttpResponseHandler直接保存响应到文件.
l 持久化cookie存储, 保存cookies到app的SharedPreferences.
l 通过BaseJsonHttpResponseHandler集成了JSON, Gson或者其它JSON序列化库.
l 通过SaxAsyncHttpResponseHandler支持SAX解析.
l 支持语言和内容编码, 不只有UTF-8.
国外有很多优秀的应用都用了它, 包括Instagram和Pinterest等.
参考: http://hc.apache.org/httpcomponents-client-4.5.x/index.html
http://blog.csdn.net/wangpeng047/article/details/19624529
http://developer.android.com/reference/java/net/HttpURLConnection.html#
http://blog.csdn.net/guolin_blog/article/details/12452307
http://download.java.net/jdk7/archive/b123/docs/api/java/net/HttpURLConnection.html
http://developer.android.com/training/volley/index.html
http://www.open-open.com/lib/view/open1437532961428.html
https://square.github.io/okhttp/