OkHttp 是一个高效的Http 客户端,是squareup 公司出品,它有以下默认特性:
1. 支持Http/2 ,允许所有同一个主机地址请求共享同一个socket 连接
2. 连接池使用较少请求延时
3. 透明的GZIP压缩减少响应数据的大小
4. 缓存响应内容,避免一些重复的请求
1) OkHttp 使用:
引入OkHttp相关库:
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
Post请求:
MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
String requestBody = "test";
//构造Request 对象
Request request = new Request.Builder().url("https://api.github.com/markdown/raw").post(RequestBody.create(mediaType,requestBody)).build();
//初始化 OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
// 创建Call对象,并通过enqueue 发起异步请求
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
2) OkHttp 工作整体流程:
1. 通过okhttpclient 创建Call, 发起同步或者异步请求
2. okhttpclient 会通过Dispatcher 对RealCall (Call的具体实现类) 进行统一管理, 并通过execute()和 enqueue() 对同步或异步请求进行处理。
3. execute() 和 enqueue() 这两个方法会最终调用RealCall 中的 getResponseWithInterceptorChain(), 从拦截器链中获取返回结果。
4. 拦截器链中,依次通过 RetryAndFollowUpInterceptor(重定向拦截器),BridgeInterceptor(桥接拦截器),CacheInterceptor(缓存拦截器),ConnectInterceptor (连接拦截器), CallServerInterceptor ( 网络拦截器) 对请求依次处理,与服务建立连接后,获取返回上诉拦截器依次处理后,最后将结果返回给调用方。
流程图如下:
3) 重要类
OkHttpClient:
OkHttpClient 继承了Call.Factory, 实现newCall, 返回一个Call对象。 使用 okHttpClient 最好创建一个单例,因为每个client 都有自己的一个连接池connection pool 和线程池 thread pools,重用这些连接池和线程池延节约内存。OkHttpClient 内部使用了builder 模式去构造。
Dispatcher:
Dispatcher 可以理解为调度器,当调用newCall 时,会不断从RequestQueue中取出请求Call, 有同步和异步请求区别,同步请求通过Call.execute() 直接返回当前的Response, 而异步请求会把当前的请求Call.enqueue 添加到请求队列中,并通过CallBack的方式来获取请求结果。
Call, RealCall:
Call 是一个接口类,定义了http 请求的方法。
RealCall 是Call的实现类,里面最主要的两个方法是execute 和 enqueue . 该类的enqueue 会去调用dispatcher中的enqueue 方法。 如果是同步请求 RealCall 会通过 getResponseWithInterceptorChain() 获取返回Response. 异步请求最终也会调用execute, 并通过callback 进行回调。
Interceptor (拦截器):
Interceptor 拦截器, 是网络请求库的核心, 它把实际的网络请求,缓存,压缩等功能统一起来, 每一个功能都是一个Interceptor, 所有拦截器连成一个Interceptor.Chain, 环环相扣,完成一次网络请求。
拦截器种类:
RetryAndFollowUpInterceptor: 负责重试和重定向
BridgeInterceptor: 先将应用层数据类型转换为网络调用层的数据类型, 然后将网络层返回的数据类型转换为应用层的数据类型。
CacheInterceptor: 负责读取缓存,更新缓存
ConnectInterceptor: 负责与服务器建立连接
NetworkInterceptor: client 设置的networkInterceptor
CallServerInterceptor: 负责向服务器发送请求数据,从服务器读取响应数据。
参考:
https://www.jianshu.com/p/310ccf5cbea6