本文我们将学习如何使用OkHttp常见用法,包括GET/POST请求,异步请求,文件上传,自定义请求头等等。
OkHttp 是一款高效的 HTTP 客户端,适用于 Android 和 Java 应用开发。
OkHttp 具有一些很多高级特性
- 支持HTTP/2,允许对同一服务器的所有请求共享一个socket
- 支持连接池减少请求延迟 (如果HTTP2不可用)
- GZIP压缩,减小数据传输
- 响应缓存避免重复网络请求。
OkHttp 可在网络不稳定时自动恢复连接。如果访问的服务器有多个IP地址,第一个连接失败时,OkHttp将尝试使用备用地址。
OkHttp 使用简单方便,接口设计为fluent模式,支持同步阻塞调用和带有回调的异步调用。下面我们开始学习如何使用
首先添加 Maven 依赖
最新版本访问 Maven 中央仓库.
同步 GET 请求示例:
对于异步GET请求,我们需要将请求加入队列(enqueue)并提供一个回调函数。当响应头准备好时,回调函数被执行,但读取response body仍然可能阻塞。
使用 HttpUrl.Builder 可用于向URL中添加请求参数:
说完了GET请求,我们来看发起POST请求。
下面构造一个RequestBody,里面包含两个参数: username和password:
更多OkHttp POST请求示例请查看我们这篇文章,
使用 MultipartBody.Builder 我们可以实现文件上传,假设我们有一个名为 的文件需要上传:
如何获取文件上传进度,我们需要重写 RequestBody 相关方法:
通过 ProgressListener 接口,我们能够观察上传进度:
ProgressRequestWrapper 继承自 RequestBody:
其中 CountingSink 继承自 ForwardingSink:
总结
- CountingSink 重写 write() 方法用于计算传输了多少字节
- ProgressRequestWrapper 继承 RequestBody 并重写 writeTo() 目的是使用我们自己的ForwardingSink
使用 addHeader 方法设置请求头
我们可以设置默认请求头,就无需为每个请求重复设置。
例如,如果我们希望为每个请求设置 content-type 为 “application/json”。可以通过设置拦截器实现:
DefaultContentTypeInterceptor 实现了 Interceptor 接口:
默认情况下OkHttp会自动跟随重定向(HTTP 301),如果我们不想跳转,需要设置 followRedirects 为 false。
如果我们设置 followRedirects 为 true,客户端会自动跟随重定向,返回状态码将为200。
网络故障可能是由于客户端连接问题、服务器宕机等其他问题。OkHttp 支持设置connect超时、read和write超时。
下面例子中,我们设置client端 readTimeout 为 1 秒,而请求响应被延迟了 2 秒:
测试将失败,因为客户端超时时间低于资源响应时间。
使用 Call.cancel() 可立即终止请求。如果一个线程当前正在写入请求或读取响应,将抛出一个 IOException。
要创建一个缓存,我们需要一个可以读写的缓存目录,以及缓存大小的限制。
客户端将使用它来缓存响应:
使用 CacheControl.FORCE_NETWORK 禁止使用缓存,使用 CacheControl.FORCE_CACHE 强制使用缓存。
在本文中,我们探讨了如何使用 OkHttp 作为 HTTP 和 HTTP/2 客户端的几个示例。
惯例,示例中的代码可以在 GitHub 项目 中找到。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/14274.html