Android提供了两种HTTP交互的方式:HttpURLConnection 和 Apache HTTP Client,虽然两者都支持HTTPS,流的上传和下载等,够我们开发用。但OkHttp让应用运行更快、更节省流量。
okhttp:能力:一般的get请求、一般的post请求、基于Http的文件上传、文件下载、加载图片、支持请求回调,直接返回对象、对象集合。
Okhttp工作原理:
1,创建 OkHttpClient对象并且默认构造builder对象进行初始化;使用Builder模式处理需要很多参数的构造函数(缓存,超时,cookie,策略等),提高代码可读性。
2,构建一个处理url的request;
3,生成call任务,执行execute异步线程池或者同步请求,控制任务队列的执行顺序。
4,拦截器拦截,发送http请求,获取response;
拦截器有:失败重定向,获取数据并缓存,网络拦截等
1)在配置 OkHttpClient 时设置了拦截器Interceptors
2)负责失败重试以及重定向的 RetryAndFollowUpInterceptor;
3)负责把用户构造的请求转换为发送到服务器的请求、把服务器返回的响应转换为用户友好的响应的 BridgeInterceptor;
4)负责读取缓存直接返回、更新缓存的 CacheInterceptor;
5)负责和服务器建立连接的 ConnectInterceptor;
6)重定向和重试的 网络拦截器 networkInterceptors;
7)负责向服务器发送请求数据、从服务器读取响应数据的 CallServerInterceptor。
OkHttp的这种拦截器链采用的是责任链模式,这样的好处是将请求的发送和处理分开,并且可以动态添加中间的处理方实现对请求的处理、短路等操作分工明细。
okHttp的底层是通过Java的Socket发送HTTP请求与接受响应的有其自己的特点:
1)支持http2,对一台机器的所有请求共享同一个socket ,提升网络速度
2)内置连接池,支持连接复用,减少延迟
3)使用okio 简化数据的存储与访问,提高性能。
Retrofit : 基于okHttp的、一种轻量级且安全的、并使用注解方式的网络请求框架
1. Retrofit使用注解方式,大大简化了我们的URL拼写形式
2. 使用简单,层次分明
3. 支持同步和异步执行
4. 更大自由度的支持我们自定义的业务逻辑
Rertrofit工作流程:
1首先定义请求接口
2通过Retrofit生成一个刚才定义的接口的实现类。
3接口进行请求:Retrofit使用注解+java接口来定义后台服务API接口
Retrofit使用的关键一步就是Retrofit.create函数创建接口动态代理
调用流程:
第一步、加载对应method的ServiceMethod实例:
首先加载需要的变量,然后创建一个该method对应的ServiceMethod实例并保存到缓存中,最后对method的定义做合法性检查
第二步、使用ServiceMethod实例和方法调用参数创建OkHttpCall来执行网络求
第三步、调用serviceMethod.callAdapter.adapt(okHttpCall)来产生method所定义的返回
Retrofit原理:
1、首先调用接口
2、retrofit对象创建一个API接口对象,使用动态代理,返回了一个OkHttpCall对象,拿到这个 Call 对象执行 HTTP 请求
3、使用动态代理对象ApiManager调用getData方法 时会被动态代理拦截创建一个 ServiceMethod对象来获取获取Http请求的方式get或者post
4、OkHttpCall是实现了Call接口的,OkHttpCall调用 ServiceMethod 获得一个可以执行的 Request 对象,然后等到 Http 请求返回后,再将 response body 传入 ServiceMethod 中, ServiceMethod 就可以调用 Converter 接口将 response body 转成一个Java对象。--执行Http请求
网友评论