当前位置:网站首页 > 技术博客 > 正文

okhttps



本文我们将学习如何使用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),如果我们不想跳转,需要设置 followRedirectsfalse

 

如果我们设置 followRedirectstrue,客户端会自动跟随重定向,返回状态码将为200。

网络故障可能是由于客户端连接问题、服务器宕机等其他问题。OkHttp 支持设置connect超时、read和write超时。

下面例子中,我们设置client端 readTimeout 为 1 秒,而请求响应被延迟了 2 秒:

 

测试将失败,因为客户端超时时间低于资源响应时间。

使用 Call.cancel() 可立即终止请求。如果一个线程当前正在写入请求或读取响应,将抛出一个 IOException

 

要创建一个缓存,我们需要一个可以读写的缓存目录,以及缓存大小的限制。

客户端将使用它来缓存响应:

 

使用 CacheControl.FORCE_NETWORK 禁止使用缓存,使用 CacheControl.FORCE_CACHE 强制使用缓存。

在本文中,我们探讨了如何使用 OkHttp 作为 HTTP 和 HTTP/2 客户端的几个示例。

惯例,示例中的代码可以在 GitHub 项目 中找到。

版权声明


相关文章:

  • 如何封装win10系统 详细图文教程2024-12-06 21:01:01
  • 一句话木马的操作流程2024-12-06 21:01:01
  • okhttp3原理2024-12-06 21:01:01
  • urllib32024-12-06 21:01:01
  • rapid程序是什么意思2024-12-06 21:01:01
  • css如何对溢出文字进行隐藏2024-12-06 21:01:01
  • rbac权限管理设计案例2024-12-06 21:01:01
  • arm架构cpu有哪些2024-12-06 21:01:01
  • opengl 教程2024-12-06 21:01:01
  • awr ads2024-12-06 21:01:01