Okhttp

来源:互联网 发布:java方向 编辑:程序博客网 时间:2024/06/13 03:46

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0326/2643.html

 

http://www.jianshu.com/p/08173e58670d

 

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0106/2275.html

 

(what)

okHttp是一个网络框架,它是一个基于Http的一个高效的客户端。底层是HttpClient

 

(why)

 1:缓存响应数据来减少重复的网络请求

 2:可以从很多常用的连接问题中自动恢复;

    Okhttp处理了很多的网络疑难杂症:会从很多常用的连接问题中自动复。如果您的服务器配置了多个IP地址,当第一个IP连接失败时,OkHttp会尝试连接下一个IP。

 3:使用起来非常的简单,可扩展性非常的强;

 

(do)

 1:支持一般的get请求,post请求。

  2:基于Http的文件上传,文件下载,上传下载的进度回调,

 3:加载图片

 4:支持请求回调,直接返回对象,

  5: 表单请求

 

(how)

1. 生成一个OkHttpClient(用以总的控制)

2. 用各种键值对包装我们的Request

3. 将请求加入队列生成一个Call管理请求

4. 若是同步请求直接执行excute等待处理返回Response,若为异步则实现Callback回调,在onResponse里获取Response参数

 

真正的请求是从创建Call对象开始的:如图

 

 

 

 

同步请求返回对象 call

异步请求返回对象 AsyncCall

每个 call对象只能被执行一次,如果想要一个完全一样的 call,可以利用 call.clone() 方法进行克隆。

 

 

我们还可以通过OKhttpClient对象来设置缓存,添加拦截器。也可以在构造request对象时设置缓存,

 

 

拦截器是一种能够监控,重写,重试调用的强大机制。

分为应用拦截和网络拦截。 

 

 1:应用拦截:

重点:

注册一个应用拦截器通过调用OkHttpClient.interceptors()返回的List的add()方法完成。

2:网络拦截:

 注册网络拦截器和注册应用拦截器很类似。只是通过networkInterceptors()方法取代了interceptore()方法。

拦截器的执行顺序:

   在拦截器的回调中,我们可以拿到两个重要的参数,一个是request,一个是response,而接口在回调时,会接收一个Chain类型的参数,这个参数保存了request和response的相关数据。该拦截器实例的功能是在请求发出前和接收到响应后。封装了一个拦截器链(Chain),并调用了Chain的proceed方法,传入原始的request对象,开始拦截器的调用。

查看proceed方法,可以看到,它使用循环+递归的方式,借助函数调用栈,将拦截器串联起来进行网络请求。

异步请求是需要创建线程池的,通过创建线程来进行请求;

 

 

 

OkHttp(GitHub:https://github.com/square/okhttp)  Interceptor 就如同名称「拦截器」一样,拦截你的 Request 做一些你想做的事情再送出去。例如:

1.自动加上使用者目前使用的语言送出去取得对应语言的回传内容。

2.将 Request 计算出这个 Request 的 sigunature 再附加上送出去。

okHttp 中分成 Application Interceptor 和 Network Interceptor 两种。 Application Interceptor 是会可以被 cache 起来的。

 

 

拦截器是 OkHttp 提供的对 HTTP 请求和响应进行统一处理的强大机制。拦截器在实现和使用上类似于 Servlet 规范中的过滤器。多个拦截器可以链接起来,形成一个链条。拦截器会按照在链条上的顺序依次执行。 拦截器在执行时,可以先对请求的 Request 对象进行修改;再得到响应的 Response 对象之后,可以进行修改之后再返回。

Interceptor 接口只包含一个方法 intercept,其参数是 Chain 对象。Chain 对象表示的是当前的拦截器链条。通过 Chain 的 request 方法可以获取到当前的 Request 对象。在使用完 Request 对象之后,通过 Chain 对象的 proceed 方法来继续拦截器链条的执行。当执行完成之后,可以对得到的 Response 对象进行额外的处理。

 

添加应用和网络拦截器

client.interceptors().add(new LoggingInterceptor()); //添加应用拦截器client.networkInterceptors().add(new LoggingInterceptor()); //添加网络拦截器