Android的三种http请求方式的区别

jiangl
  • 762

关于Android的三种http请求方式:
(1)okhttp
(2)httpURLConnection
(3)httpClient

谁熟悉的能介绍一下,并解析一下区别呢?

回复
阅读 6.7k
2 个回答

这个问题有点问题,这并不是三种方式,okhttp只是对网络访问的一个更高层的封装,httpURLConnection和httpClient是具体两种实现访问的方式。
1)、HttpClient
HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。

特点:

  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. 设置连接超时的能力。
    使用方法

使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。

  1. 创建HttpClient对象。

  2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。

  3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。

  4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。

  5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

  6. 释放连接。无论执行方法是否成功,都必须释放连接

2)、HttpURLConnection
直接给你找个图吧
Center

3)okhttp
这个你搜一下网上解析一堆,我就不搬运了

这里要说一点的是:在Android 2.3及以上版本,尽量使用HttpURLConnection,而在Android 2.2及以下版本,尽量使用HttpClient。
因为:
HttpClient
DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具体的实现类,它们都拥有众多的API,而且实现比较稳定,bug数量也很少。
但同时也由于HttpClient的API数量过多,使得我们很难在不破坏兼容性的情况下对它进行升级和扩展,所以目前Android团队在提升和优化HttpClient方面的工作态度并不积极。
HttpURLConnection
HttpURLConnection是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。虽然HttpURLConnection的API提供的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它。
不过在Android 2.2版本之前,HttpURLConnection一直存在着一些令人厌烦的bug。比如说对一个可读的InputStream调用close()方法时,就有可能会导致连接池失效了。那么我们通常的解决办法就是直接禁用掉连接池的功能

区别太大,展开得话费不少口舌,就简单讲一下吧。

HttpClient是Java界比较出色的一个HTTP客户端工具包,所以最初Android也把它纳入到支持中,希望大家可以方便的使用它进行HTTP请求。然而Android最初纳入的居然是HttpClient的一个测试版,这就导致之后在Android中使用HttpClient可谓Bug百出。而Android的工程师们似乎并不打算解决这个问题,甚至在后来的框架里直接把HttpClient给踢了出去,所以基本就不推荐在Android使用HttpClient了。

为什么Android愿意抛弃HttpClient呢?一个重要的原因就是他们更期望使用HttpURLConnection。HttpURLConnection属于Java API的范畴,相比于HttpClient这种第三方库,HttpURLConnection更容易掌握在Google自己手中。不过HttpURLConnection封装比较简单,对HTTP请求的处理算是比较底层吧,使用起来并不是特别方便。

OkHttp和HttpClient差不多,也是一个第三方库。不过它的封装相对高层一些,也就是更简单易用一些,并且它对Android有专门的支持,比HttpClient那种烂尾工程要好很多。

宣传栏