背景
之前请求 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 发送请求 参考 OkHttp OkHttp Wiki Okhttp3 基本使用
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于