okhttp的简单描述
OkHttp是一个轻量级网络请求框架
okhttp学习需要注意的点
1、okhttp的dispatcher如何分发的,并且如何存储请求的?
通过excute 放入runningSync请求队列,equeue放入runningASync或者ready请求队列
(注:同一个域名的最大请求5个,所有请求的最大数64个)
2、okhttp的线程池有什么特点?
此线程池是一个队列大小为0的队列,为保证每个请求交给线程池时就会立即执行。
3、okhttp的每个拦截器作用?
以下有简述
4、okhttp的请求连接池是如何复用的?
(使用完的socket会存放在connectionPool中,connectionPool的最大数时5个,存放socket时会将超过时间的socket清除,若都未超过并且大于5个时,将存放时间最长的那个清除。
下次请求会检查connectionPool中是否有闲置的socket可用)
okhttp的流程图
okhttp的简单使用
同步请求
String url = "http://taobao.com";
OkHttpClient client = new OkHttpClient.Builder().build();
Request request = new Request.Builder().url(url).build();
Call call = client.newCall(request);
try {
call.execute();
} catch (IOException e) {
e.printStackTrace();
}
异步请求
String url = "http://taobao.com";
OkHttpClient client = new OkHttpClient.Builder().build();
Request request = new Request.Builder().url(url).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
// do something
}
}
@Override
public void onFailure(Call call, IOException e) {
// do something
}
});
okhttp的分发器
okhttp的拦截器
RetryAndFollowUpInterceptor失败重连以及重定向的拦截器
原理:一个循环来不停的获取response。每循环一次都会获取下一个request,如果没有,则返回response,退出循环。而获取下一个request的逻辑,是根据上一个response返回的状态码,分别作处理。
注:
通过okHttpClient可以设置是否重试
若返回的header中存在Location字段,则会将Location字段的val链接重新封装成Request请求进行重定向
BridgeInterceptor桥接拦截器
原理:请求从应用层数据类型类型转化为网络调用层的数据类型;将网络层返回的数据类型 转化为 应用层数据类型。
注:
添加Header:keep-alive,content-type,gzip压缩
对Response进行gzip解压缩
CacheInterceptor缓存拦截器
原理:缓存拦截器的主要作用是将请求 和 返回 关连得保存到缓存中。客户端与服务端根据一定的机制,在需要的时候使用缓存的数据作为网络请求的响应,节省了时间和带宽。
注:
通过缓存策略、指定的Cache-control等字段和状态码判断缓存是否可以用,是否有效。
连接拦截器 和 最后的请求服务器的拦截器
原理:两个连接器基本上完成了最后发起网络请求的工作。追所以划分为两个拦截器,除了解耦之外,更重要的是在这两个流程之间还可以插入一个专门为WebSocket服务的拦截器( WebSocket一种在单个 TCP 连接上进行全双工通讯的协议)。
注:Connection拦截器:请求连接池,即Socket的复用,默认缓存5个Socket(IP+端口号已绑定)
CallServer拦截器:将请求的数据转成网络请求的数据格式进行真正连接请求
详细地址OkHttp源码彻底解析(四)OkHttp拦截器的作用
okhttp使用到的设计模式
建造者模式
工厂模式
责任链模式
okhttp的注意事项
1、如果post请求的内容为空,不能传空的requestBody会报错 java.lang.IllegalArgumentException: method POST must have a request body
#如果post请求的body和contentType为空
RequestBody.create(null, “”)
2、Response需要关闭
有些方法会关闭资源,有些不会,这一点要注意
3、推荐使用OkhttpClient单例
4、压缩支持
默认开启压缩支持,不需要手动设置(手动设置需要更多设置); 原理:使用拦截器,解析压缩数据
5、默认开启Keep-Alive;
6、Callback在子线程中回调,大部分时候,我们都是需要更新UI的,还需自己post到主线程中处理。