搜索

首页  >  问答  >  正文

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

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

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

PHP中文网PHP中文网2811 天前608

全部回复(2)我来回复

  • 高洛峰

    高洛峰2017-04-17 17:47:01

    这个问题有点问题,这并不是三种方式,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
    直接给你找个图吧

    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()方法时,就有可能会导致连接池失效了。那么我们通常的解决办法就是直接禁用掉连接池的功能

    回复
    0
  • ringa_lee

    ringa_lee2017-04-17 17:47:01

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

    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那种烂尾工程要好很多。

    回复
    0
  • 取消回复