文章目录
- OkHttp:Square 出品的 Java/Android HTTP 客户端
- 做了哪些事
- 接口设计
- 遵循规范
- 兼容性和依赖
- 测试支持
- 一句话总结
OkHttp:Square 出品的 Java/Android HTTP 客户端
做 Java 或 Android 开发的人,基本都绕不开网络请求。原生 HttpURLConnection 用起来繁琐,自己封装又容易出各种边界问题。Square 公司开源的 OkHttp,就是专门解决这个问题的 HTTP 客户端库,目前在 GitHub 上有 4.7 万 Star。
做了哪些事
OkHttp 的设计目标很明确:让 HTTP 请求更高效、更可靠。
效率方面,它默认支持 HTTP/2,同一个主机的多个请求可以复用同一个 TCP 连接。如果服务端不支持 HTTP/2,它会自动退回到连接池模式,减少握手开销。响应体默认开启 GZIP 压缩,重复请求还能走本地缓存,省掉网络开销。
可靠性方面,当网络不稳定时,OkHttp 会自动处理常见的连接问题。如果某个服务有多个 IP 地址,第一个连不上会自动尝试下一个,这对 IPv4/IPv6 双栈和多数据中心部署的场景很实用。TLS 方面支持 TLS 1.3、ALPN 和证书锁定。
接口设计
OkHttp 的 API 风格是 Builder 模式加不可变对象。一个 GET 请求写下来就几行:
OkHttpClientclient=newOkHttpClient();Requestrequest=newRequest.Builder().url(url).build();try(Responseresponse=client.newCall(request).execute()){returnresponse.body().string();}POST 请求类似,构造一个 RequestBody 塞进去就行。同步和异步两种调用方式都支持,异步走回调。
遵循规范
OkHttp 严格遵循 HTTP 相关的 RFC 标准,包括 HTTP 语义(RFC 9110)、缓存(RFC 9111)、HTTP/1.1(RFC 9112)、HTTP/2(RFC 9113)、WebSocket(RFC 6455)和 SSE。当规范有歧义时,它参考主流浏览器和常见 HTTP 库的行为。
这种"有原则"的设计也带来了一些限制,比如不允许 GET 请求带 body,缓存也不是可替换的接口。对大多数业务场景来说,这些限制不是问题。
兼容性和依赖
OkHttp 支持 Android 5.0+(API 21)和 Java 8+。它依赖 Okio 做高性能 I/O,依赖 Kotlin 标准库,两个都是小体量的库,向后兼容性好。
安全方面,OkHttp 使用平台内置的 TLS 实现。在 Java 平台上还支持 Conscrypt,把 BoringSSL 集成进来,加一行代码就能启用。官方建议保持版本更新,毕竟 HTTPS 客户端的安全补丁不能拖。
测试支持
项目自带 MockWebServer,可以模拟 HTTP/HTTPS/HTTP/2 服务端,用于测试。不过官方说明这个库主要用于内部测试和基础场景,功能有限,复杂需求建议用 MockServer 这类专业工具。
构建方面,OkHttp 已经是 Kotlin Multiplatform 项目,Maven 用户需要注意选 okhttp-jvm 或 okhttp-android。Gradle 用户直接用 BOM 管理版本就行,官方给了现成的配置示例。还支持 GraalVM Native Image 和 Java 9 Modules。
一句话总结
如果你在做 Java 或 Android 的网络层,OkHttp 是目前最成熟的选择之一。API 设计干净,性能和可靠性经过大量生产验证,Square 的维护也一直在线。
目前最成熟的选择之一。API 设计干净,性能和可靠性经过大量生产验证,Square 的维护也一直在线。