Java HTTP客户端:顶级库概览
在现代Java开发中,几乎没有应用程序能脱离HTTP协议进行交互。向REST API发送请求、文件上传、与微服务协作——所有这些都需要一个可靠且便捷的HTTP客户端。本文将介绍四种最流行的Java HTTP库:标准库HttpClient(Java 11+)、Apache HttpClient、OkHttp和Retrofit。您将了解它们的特点、优势,并获取实用的代码示例。
1. Java 11 HttpClient (java.net.http)
从Java 11开始,标准库中新增了一个现代化的HTTP客户端,旨在取代过时的HttpURLConnection。它支持HTTP/2、WebSocket、异步请求和响应式流。
优势:
- 无需额外依赖——内置于JDK中。
- 支持HTTP/2及协议自动升级。
- 便捷的API,支持同步和异步调用。
- 内置对Cookie、重定向和认证的处理支持。
同步GET请求示例:
import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;
public class Java11HttpClientExample { 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")) .GET() .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println("Status code: " + response.statusCode()); System.out.println("Body: " + response.body()); }}异步POST请求示例:
import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;import java.net.http.HttpRequest.BodyPublishers;import java.util.concurrent.CompletableFuture;
public class AsyncPostExample { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://jsonplaceholder.typicode.com/posts")) .header("Content-Type", "application/json") .POST(BodyPublishers.ofString("{\\"title\\":\\"foo\\",\\"body\\":\\"bar\\",\\"userId\\":1}")) .build();
CompletableFuture<HttpResponse<String>> future = client.sendAsync(request, HttpResponse.BodyHandlers.ofString()); future.thenAccept(response -> { System.out.println("Status: " + response.statusCode()); System.out.println("Body: " + response.body()); }).join(); }}2. Apache HttpClient
来自Apache的经典库,长期以来一直是事实上的标准。最新版本(5.x)获得了显著改进:支持HTTP/2、改进的连接池处理以及更灵活的配置。
优势:
- 最大的灵活性和精细配置(超时、拦截器、缓存)。
- 久经考验的稳定性。
- 支持多种认证方案(Basic、Digest、NTLM)。
- 与代理和SSL的良好集成。
使用Apache HttpClient 5的GET请求示例:
import org.apache.hc.client5.http.classic.methods.HttpGet;import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;import org.apache.hc.client5.http.impl.classic.Clos