Android中对Http的了解

来源:互联网 发布:数据资产管理体系 编辑:程序博客网 时间:2024/06/05 09:37

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/

https://github.com/wyouflf/xUtils

http://loopj.com/android-async-http/

0 0
原创粉丝点击