OkHttp:Android 和 Java 的 HTTP 客户端

OkHttp 是 Square 开源的 HTTP 客户端库,GitHub 上拿到了近 47k Star,是 Java 和 Android 生态里使用最广泛的网络库之一:

正文顶部截图

README区域截图

OkHttp 适用于 Android 5.0 及以上版本,同时支持 Java 8 以上的服务端环境。在 Android 平台上,大量知名应用的网络层都在使用它。最新的 5.x 版本已经重构为 Kotlin Multiplatform 项目,除了 JVM 和 Android 之外,也在向其他平台扩展。

OkHttp 默认就做了性能优化,开箱即用不需要额外配置。HTTP/2 让同一个主机的多个请求共享一个 Socket 连接;连接池机制在不支持 HTTP/2 的环境下降低请求延迟;透明 GZIP 压缩减小传输体积;响应缓存让重复请求直接走本地,跳过网络。

网络环境不稳定的时候,OkHttp 的表现也比较稳。它会静默处理常见的连接问题。如果服务有多个 IP 地址,第一个连接失败后会自动尝试其他地址,这对 IPv4 和 IPv6 混合部署以及多数据中心场景很有用。TLS 方面支持 1.3、ALPN 和证书固定,也可以配置降级以保证兼容性。

基本用法

发起一个 GET 请求只需要几行代码:

OkHttpClient client = new OkHttpClient();

String run(String url) throws IOException {
  Request request = new Request.Builder()
      .url(url)
      .build();
  try (Response response = client.newCall(request).execute()) {
    return response.body().string();
  }
}

POST 请求同样简洁:

public static final MediaType JSON = MediaType.get("application/json");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
  RequestBody body = RequestBody.create(json, JSON);
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
  try (Response response = client.newCall(request).execute()) {
    return response.body().string();
  }
}

API 设计上用了 Builder 模式,请求对象创建后不可变,同时支持同步阻塞调用和异步回调两种方式。

协议支持

OkHttp 遵循主流 HTTP 规范,覆盖了 RFC 9110(HTTP 语义)、RFC 9111(缓存)、RFC 9112(HTTP/1.1)、RFC 9113(HTTP/2)、RFC 6455(WebSocket)以及 Server-sent Events。规范存在模糊的地方,OkHttp 会参考主流浏览器和常见 HTTP 库的行为来处理。

有一点需要注意:OkHttp 对请求做了原则性约束,不允许 GET 请求带 body,缓存也不提供可替换的接口。这是有意为之,目的是避免绕过有 bug 的服务器或构造不合规的请求。

依赖和集成

OkHttp 底层依赖 Square 自家的 Okio 做高性能 I/O,还依赖 Kotlin 标准库。两个依赖都很小,向后兼容性好。

Gradle 项目直接引用即可:

implementation("com.squareup.okhttp3:okhttp:5.4.0")

项目还提供了 BOM(Bill of Materials)来统一管理版本:

dependencies {
  implementation(platform("com.squareup.okhttp3:okhttp-bom:5.4.0"))
  implementation("com.squareup.okhttp3:okhttp")
  implementation("com.squareup.okhttp3:logging-interceptor")
}

Maven 项目需要在 okhttp-jvmokhttp-android 之间做选择,因为 OkHttp 从 5.x 开始作为 Kotlin Multiplatform 项目发布,Maven 下 okhttp artifact 本身是空的。

测试支持

OkHttp 自带 MockWebServer 库,可以用来测试 HTTP、HTTPS 和 HTTP/2 客户端:

testImplementation("com.squareup.okhttp3:mockwebserver3:5.4.0")

MockWebServer 主要用于基础测试和内部测试。如果需要更完整的 HTTP 测试能力,可以考虑 MockServer 等独立方案。

安全更新

OkHttp 团队持续跟踪 TLS 生态变化并及时调整,项目方还专门维护了一份 TLS 配置历史记录。建议保持 OkHttp 处于最新版本,和浏览器自动更新的逻辑类似,HTTPS 客户端保持更新是对抗安全问题的基本手段。在 Java 平台上还可以接入 Google 的 Conscrypt,将 BoringSSL 集成进来以获得更好的 TLS 支持。

OkHttp 5.x 要求 Java 9 Modules,内部包对外不可见。如果代码里引用了 okhttp3.internal 下的类,编译时会直接报错。公开 API 由 okhttp3、okhttp3.logging、okhttp3.sse 等模块定义,升级前需要确认没有依赖内部实现。

项目采用 Apache 2.0 许可证,商业使用没有限制。

API 由 okhttp3、okhttp3.logging、okhttp3.sse 等模块定义,升级前需要确认没有依赖内部实现。

项目采用 Apache 2.0 许可证,商业使用没有限制。

更多推荐