OkHttp是一个来自Square的HTTP客户端,用于Java和Android应用程序。它的设计是为了更快地加载资源并节省带宽。OkHttp在开源项目中被广泛使用,是Retrofit、Picasso等库的骨干。
以下是使用OkHttp的主要优势。
- 支持HTTP/2(有效使用套接字)
- 连接池(在没有HTTP/2的情况下减少请求延迟)
- GZIP压缩(缩小下载大小)
- 响应缓存(避免了重新获取相同的数据)
- 从常见的连接问题中无声恢复
- 替代IP地址检测(在IPv4和IPv6环境下)
- 支持现代TLS功能(TLS 1.3,ALPN,证书钉子)。
- 支持同步和异步调用
在本指南中,我们将通过为Android构建一个假想的待办事项列表应用程序来介绍OkHttp的基础知识。
首先,让我们为我们的待办事项列表应用程序定义一些功能需求。我们的用户希望能够从待办事项服务器上看到他们保存的待办事项,在服务器上保存一个新的待办事项,并且安全地、单独地访问他们自己的待办事项。
作为开发者,我们希望能够轻松地调试我们应用程序的网络通信,并减少服务器端的负载。
稳定的OkHttp 4.x在Android 5.0+(API级别21+)和Java 8+上工作。如果你需要较低的Android和Java版本的支持,你仍然可以依靠OkHttp 3.12.x分支,但要注意一些问题。
当导入OkHttp时,它还会带来两个依赖项。Okio,一个高性能的I/O库,以及Kotlin标准库。你不需要单独导入这些。
要在你的Android项目中使用OkHttp,你需要在应用级Gradle文件中导入它。
不要忘记,在Android上,如果你想访问网络资源,你需要在你的应用程序的 文件中申请 的权限。
为了让我们的用户从服务器上看到他们所有保存的待办事项,我们需要同步和异步的GET请求,以及查询参数。
为了从服务器上获得我们的待办事项列表,我们需要执行一个GET HTTP请求。OkHttp通过 ,提供了一个不错的API来构建请求。
做一个GET请求就像这样简单。
正如你所看到的,这是一个用OkHttp执行请求的同步方式。(你应该在一个非UI线程上运行,否则,在你的应用程序中会有性能问题,而且Android会抛出一个错误)。
这个请求的异步版本为你提供了一个回调,当响应被取走或发生错误时。
注意:从现在开始,我将只展示同步版本的调用,以避免使用大量的模板代码。只要有可能,我也会尝试使用标准的Java APIs,以使代码在非Android环境中可重复使用。
你可以向你的请求传递查询参数,比如在服务器端实现对已完成或未完成的待办事项进行过滤。
将生成带有查询参数的适当URL。 .
你可能会理所当然地问:"为什么不直接使用手动创建的URL本身呢?"你可以。但是一旦你的URL构建逻辑变得更加复杂(更多的查询参数),那么这个类就会派上用场。该库的开发者有额外的理由来使用HttpUrl。
现在我们已经从我们的服务器上下载了所有的待办事项。但是如何创建新的to-dos或将一个to-dos标记为完成?用一个简单的POST请求。
让我们向我们的端点发送POST请求。
正如你所看到的,POST请求的主体是一个 key-value pair数据。但我们可以发送任何我们想要的类型。下面是一个以JSON为主体的例子。
我们也有可能想给我们的新待办事项附上一个文件(如图片)。
与之前类似,我们执行一个多部分的HTTP请求,在那里我们可以附加所需的文件。
在保存待办事项时,有可能不小心选择了错误的附件,所以与其等到上传结束,不如确保请求可以随时取消,并在以后用正确的值重新启动。
现在,我们拥有了在我们的应用程序中实现基本功能所需的所有知识。我们可以检查我们的待办事项列表,我们可以添加新的待办事项,我们也可以改变它们的状态。
让我们来看看我们应用程序的安全方面。
我们的后端已经实现了一个基本的基于用户名/密码的认证,以避免看到和修改对方的待办事项。
现在访问我们的数据需要在我们的请求上设置一个 头。没有这个,请求可能会以 响应而失败。
上的 方法将让我们指定任意多的自定义头信息。
现在,只有当有人知道我们的用户名和密码时,我们的敏感数据才能被访问。但是,如果有人在网络上监听,并试图用中间人攻击和伪造的证书劫持我们的请求怎么办?
OkHttp为你提供了一个简单的方法,通过使用证书平移器只信任你自己的证书。
在这里,我们使用 来建立一个自定义的OkHttp客户端(后面会有更多的介绍)。然后,通过 ,我们选择哪些特定域名的证书被信任。
关于证书锁定和一般安全的更多信息,请访问相关的OkHttp文档页面。
如果在发出请求时发生了问题,我们必须深入挖掘它发生的原因。OkHttp有自己的内部API来启用调试日志,这可以帮助我们。但是我们也可以利用OkHttp的拦截器API来使我们的生活更轻松。
拦截器可以监控、重写和重试调用。我们可以利用它们在请求发出之前对其进行修改,在响应到达我们的逻辑之前对其进行预处理,或者简单地打印出一些关于请求的细节。
OkHttp有自己的预制日志拦截器,我们可以通过Gradle导入。
并使用它。
或者我们可以实现我们自己的自定义拦截器。
我们也可以根据我们的需要,在应用和网络层面上声明我们的拦截器。你可以在这里阅读更多关于这方面的内容。
有时候,操作我们后端API的响应是很有用的。我们可以通过操作服务器端的代码来实现这个目的,但是通过代理服务器会更有效率。
我们可以在设备本身使用一个系统范围内的代理配置,或者指示我们的OkHttp客户端在内部使用一个代理。
在我们调试了我们的应用程序之后,你可能已经注意到,我们完成了很多不必要的请求,给我们的服务器带来了额外的负载。如果后台没有变化,就没有必要再去获取待办事项列表。
在OkHttp中有一个默认的缓存实现,我们只需要指定缓存位置和它的大小,像这样。
但如果你想自定义行为,你可以对它进行疯狂的操作。
如果你有自定义的缓存逻辑,你也可以实现你自己的缓存方式。例如,你可以先向你的服务器执行一个 请求,然后检查缓存指示头,如果有变化,就向同一个URL执行一个 请求来获取内容。
我们已经介绍了 的一些用法。如果我们想改变默认的OkHttp客户端行为,这个类是很有用的。
有一些参数值得一提。
完整的列表,请访问文档。
想到了一个合作的待办事项列表?或者一旦有新的待办事项加入就通知用户?在一个待办事项上进行实时聊天如何?OkHttp在这里也为你提供了帮助。
如果你已经完成了WebSocket服务器端的实现,你可以连接到该端点,并从OkHttp客户端获得实时信息传递。
我们不能忘记测试。OkHttp提供了自己的MockWebServer来帮助测试HTTP和HTTPS网络调用。它可以让我们指定对哪个请求返回哪个响应,并验证该请求的每个部分。
要开始,我们需要通过Gradle导入它。
这里有一些重要的API。
- : 启动本地主机上的模拟网络服务器
- : 排一个 。这是一个先进先出的队列,确保请求将按照排队的顺序收到响应。
- :一个可编写的OkHttp响应
- :一个HTTP请求,该请求被收到了。
- :把下一个到达的请求转给一个队列。
一旦我们理解了这些基础知识,我们就可以编写我们的第一个测试。现在,对于一个基本的GET请求。
总之,OkHttp是一个强大的库,它提供了大量的好处,包括HTTP/2支持,连接问题的恢复机制,缓存,以及现代TLS支持。
如果你曾经试图通过默认的Android和Java网络API从头开始实现这些功能,你就会知道这是多么大的工作量和痛苦(以及有多少边缘情况是你忘记涵盖的)。幸运的是,用OkHttp在你的应用程序中实现网络,使之变得简单。
更多细节,请访问项目页面和GitHub。你可以找到一些有用的扩展、实现样本和测试实例。
The postA complete guide to OkHttpappeared first onLogRocket Blog.
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/9952.html