基本使用分为四步
//获取一个客户端
OkHttpClient client = new OkHttpClient.Builder()
...
.build();
构建Request
//构建一个Request
Request request = new Request.Builder()
.url(url)
.build();
获取Call对象
//获取Call对象
Call call=client.newCall(request);
发送请求(execute同步/enqueue异步)
//同步调用
Response response = call.execute();
//异步调用
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
复杂点的使用:
1 在使用类似POST等可以设置请求体的请求方法时,我们还可以如下构建请求体
构建字符串,字节,文件请求体:
public static final MediaType TEXT = MediaType.parse("text/plain; charset=utf-8");
public static final MediaType STREAM = MediaType.parse("application/octet-stream");
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
//构建字符串请求体
RequestBody body1 = RequestBody.create(TEXT, string);//要传递的数据的MIME类型,请求内容
//构建字节请求体
RequestBody body2 = RequestBody.create(STREAM, byte);//要传递的数据的MIME类型,请求内容
//构建文件请求体
RequestBody body3 = RequestBody.create(STREAM, file);//要传递的数据的MIME类型,请求内容
//构建JSON请求体
RequestBody body4 = RequestBody.create(JSON, json);//要传递的数据的MIME类型,请求内容
//将请求体设置给请求方法内
Request request = new Request.Builder()
.url(url)
.post(xx)// xx表示body1,body2,body3,body4中的某一个
.build();
构建表单请求体:
//构建表单RequestBody
RequestBody formBody=new FormBody.Builder()
.add("name","maplejaw")
.add("age","18")
...
.build();
构建分块表单请求体:
一般用于文件上传之类的,多数据类型请求
public static final MediaType STREAM = MediaType.parse("application/octet-stream");
RequestBody fileStream=RequestBody.create(STREAM,file);//要传递的数据的MIME类型,请求内容
//构建表单RequestBody
RequestBody multipartBody=new MultipartBody.Builder()
.setType(MultipartBody.FORM)//指明为 multipart/form-data 类型
.addFormDataPart("name","maplejaw") //添加表单数据
.addFormDataPart("age","20") //添加表单数据
.addFormDataPart("avatar","111.jpg",fileStream) //添加文件,其中avatar为表单名,111.jpg为文件名。
.addPart(..)//该方法用于添加自定义Part,一般来说以上已经够用
.build();
okhttp是 对http协议进行的一个java实现
因此可以从源码中了解到所有http协议的相关内容,只要协议内容,可以更好的理解 okhttp源码
你应该知道的HTTP基础知识
okhttp最重要的设计模式:责任链模式
五个拦截器
在责任链的末端的五个拦截器,
- RetryAndFollowUpInterceptor:Interceptor实现类之一,是网络请求失败时进行重连及服务器返回当前请求需要进行重定向的拦截器
- BridgeInterceptor:桥接连接器,主要是进行请求前的一些操作,将我们的请求设置成服务器能识别的请求,比如设置一系列头部信息,比如设置请求内容长度,编码,gzip压缩,cookie等
- CacheInterceptor:缓存拦截器,这个就很明显了,作用是缓存请求和响应,比如同一个请求之前发生过,这次就不需要重新构建了,直接从缓存取;响应同理
- ConnectInterceptor:连接拦截器,为当前请求找到一个合适的连接,比如如果从连接处中可以找到能复用的连接,就不要再创建新的连接了
- CallServerInterceptor:连接服务器拦截器,负责向服务器发送真正的请求,接受服务器的响应
Dispatcher
- 线程池和三个队列
- 异步请求两个:
readyAsyncCalls:保存等待执行的异步请求;
runningAsyncCalls:保存正在运行的异步请求; - 同步请求一个
runningSyncCalls:保存正在执行的同步请求.
参考知识
1 OkHttp3 源码解读
2 OKHttp3框架解析