Java 11 引入了一个全新的标准 HTTP 客户端 API,旨在取代旧的 HttpURLConnection
API,并提供对现代 HTTP 协议的支持,包括 HTTP/2 和 WebSocket。这个新的 HTTP 客户端 API 被设计得更加现代化、易用且高效。
主要特性
- 支持 HTTP/2: 新的 HTTP 客户端默认支持 HTTP/2,这带来了性能上的显著提升,比如多路复用(multiplexing)、头部压缩等特性。
- 流畅的 API 设计: 新的 API 提供了流畅的构建方式,使得编写网络请求代码变得更加直观和简洁。
- 异步与同步支持: 支持同步和异步请求处理,允许开发者根据需求选择最合适的请求方式。
- WebSocket 支持: 内置了对 WebSocket 的支持,方便实现实时双向通信应用。
- 更好的资源管理: 自动管理连接池和其他资源,减少了手动管理带来的复杂性。
使用示例
以下是一些使用 Java 11 标准 HTTP 客户端 API 的基本示例:
发送 GET 请求
java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class HttpClientExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://jsonplaceholder.typicode.com/posts/1"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
发送 POST 请求
java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
public class HttpClientPostExample {
public static void main(String[] args) throws Exception {
String jsonInputString = "{ "title": "foo", "body": "bar", "userId": 1 }";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://jsonplaceholder.typicode.com/posts"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonInputString, StandardCharsets.UTF_8))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
异步请求
对于需要非阻塞操作的情况,可以使用异步方法:
java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;
public class HttpClientAsyncExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://jsonplaceholder.typicode.com/posts/1"))
.build();
CompletableFuture<HttpResponse<String>> future = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
future.thenApply(HttpResponse::body)
.thenAccept(System.out::println);
// 等待异步操作完成
future.join();
}
}
总结
Java 11 的新 HTTP 客户端 API 提供了对现代 HTTP 协议的强大支持,简化了网络编程的工作量,并提高了开发效率。无论是发送简单的 GET 请求还是复杂的异步交互,新的 API 都能提供灵活且强大的解决方案。如果你正在考虑升级到 Java 11 或更高版本,尝试使用这个新的 HTTP 客户端将是一个不错的选择。