背景
之前请求 http 服务器,一直在使用 httpClient 库,最近发现 android 开发中广泛使用的为 okHttp 库。
本文体验一下 okHttp 库。
介绍
okHttp 库是一个 HTTP 客户端,在 Android 开发中广泛使用,特点为:
- 支持 HTTP/2,允许对一个站点的所有请求共享一个 socket。
- 如果服务端不支持 HTTP/2,则使用连接池,来降低请求延时。
- 透明使用 GZIP,来减少下载字节。
- 缓存响应结果,对于重复请求直接读缓存,不再走网络请求。
使用
pom 依赖
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.11.0</version>
</dependency>
同步调用
异步调用
异步发起的请求会被加入到 Dispatcher
中的 runningAsyncCalls
双端队列中通过线程池来执行。不会阻塞主线程。
可以设置每个 webserver 的最大并发数(默认为 5), 以及全局最大并发数(默认为 64)
Post 方法
RequestBody 有多种构造方法
数据流
不断的写入 sink 即可。
RequestBody body = new RequestBody() {
@Override
public void writeTo(BufferedSink sink) throws IOException {
sink.writeUtf8("ip=myip");
}
@Override
public MediaType contentType() {
return MediaType.parse("application/x-www-form-urlencoded");
}
};
提交文件
会自动从文件中把内容读出来
File file = new File("/tmp/ip.txt");
RequestBody body = RequestBody.create(MediaType.parse("application/x-www-form-urlencoded"), file);
提交表单
RequestBody body = new FormBody.Builder().add("ip", "myip").build();
提交分块请求
// 使用imgur图片上传api为例. client-Id需要自己申请.
// https://api.imgur.com/endpoints/image
MultipartBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addPart(Headers.of("Content-Disposition", "form-data; name=\"title\""),
RequestBody.create(null, "abeffect test"))
.addPart(Headers.of("Content-Disposition", "form-data; name=\"image\""),
RequestBody.create(MediaType.parse("image/jpg"), new File("/tmp/1.jpg")))
.build();
Request request = new Request.Builder().header("Authorization", "Client-ID your-own-client-id")
.url("https://api.imgur.com/3/image").post(body).build();
完整代码
拦截器(Interceptors)
图片来自[2]
拦截器,就是在调用前后可以插入自己的代码。okHttp 可以在 Application 请求 OkHttp 前后进行拦截,也可以 OkHttp 请求 Network 前后进行拦截。
应用拦截器
应用拦截器,在请求 OkHttp core 时进行拦截。
网络拦截器
除了执行时的调用位置不同,其它和应用拦截器是一样的。
内置拦截器
内置拦截器有下面这些,这里同时附上两个自定义拦截器,按执行顺序排列好:
- client.interceptors(): 自定义的应用拦截器
- RetryAndFollowUpInterceptor: 跟踪重定向,用户验证和错误等, 默认最多 20 个.
- BridgeInterceptor: 桥接应用代码和网络代码, 添加必要的头信息,处理 gzip 等
- CacheInterceptor: 维护请求的缓存
- ConnectInterceptor: 向 server 建立连接
- client.networkInterceptors(): 自定义的网络拦截器
- CallServerInterceptor: 链中最后一个拦截器,向 server 发送请求
参考
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于