okHttp 是一个高效的网络请求框架,默认支持
- HTTP/2 支持允许对同一主机的所有请求共享一个套接字
- 连接池减少了请求延迟(如果 HTTP/2 不可用)
- 透明 GZIP 缩小了下载大小
- 响应缓存完全避免了网络重复请求
Get a URL
java
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpGetExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://www.example.com")
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
String responseData = response.body().string();
System.out.println(responseData);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Post to a Server
java
import okhttp3.*;
import java.io.IOException;
public class OkHttpPostExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.get("application/json; charset=utf-8");
String json = "{"key":"value"}";
RequestBody body = RequestBody.create(mediaType, json);
Request request = new Request.Builder()
.url("https://www.example.com")
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
String responseData = response.body().string();
System.out.println(responseData);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
和原生方案对比
Java 1.1 引入HttpURLConnection
用于处理 HTTP 请求的类,它提供了基本的 HTTP 请求功能,适用于简单的 HTTP 请求场景。但其使用过程相对繁琐、不支持链式调用、缺乏异步处理能力、对 HTTP/2 协议的支持有限,使用不是非常广泛
Java 11 引入了新的 HttpClient
API,简化了 API,并且提供了原生 HTTP/2 支持,同时支持异步请求。
java
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Java11HttpClientGetExample {
public static void main(String[] args) throws IOException, InterruptedException {
// 创建 HttpClient 实例
HttpClient client = HttpClient.newHttpClient();
// 创建 HttpRequest 对象
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.example.com"))
.build();
// 发送请求并获取响应
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
// 输出响应码和响应内容
System.out.println("响应码: " + response.statusCode());
System.out.println("响应内容: " + response.body());
}
}
虽然 HttpClient
为 Java 开发者提供了一个强大且内置的 HTTP 客户端工具,但 OkHttp 依然凭借其丰富的功能特性、灵活的配置选项、强大的社区支持以及在特定环境下(如 Android 开发)的卓越表现,保持了其在许多项目中的不可替代性
- 拦截器机制: OkHttp 提供了灵活的拦截器机制,允许开发者在请求发送前和响应接收后插入自定义逻辑。这对于日志记录、请求修改、身份验证、重试策略等操作尤为方便。
- 高效的缓存机制:OkHttp 内置了强大的缓存功能,能够自动缓存服务器响应,减少重复的网络请求,从而提高应用性能。
- 灵活的连接池配置:OkHttp 提供了高度可定制的连接池选项,可以根据项目需求调整最大连接数、连接空闲时间等参数。通过有效管理连接池,OkHttp 能够重用现有连接,降低新建连接的开销,减少网络延迟,提升整体性能。
- 更好的 Android 兼容性
- 官方推荐的 HTTP 客户端库:在 Android 开发中,OkHttp 被官方推荐为首选的 HTTP 客户端库,具有广泛的使用基础和良好的社区支持。
- 优化移动网络性能:专为移动环境设计,OkHttp 在处理不稳定网络连接、数据压缩和延迟优化方面表现出色,确保应用在各种网络条件下的稳定性和高效性。
- 易于集成:与 Android Studio 和常用框架(如 Retrofit)无缝集成,简化了网络请求的实现过程。
maven 依赖
xml
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>