在Java中,HttpClient是用于发送HTTP请求的API。从Java 11开始,Java标准库提供了内置的HttpClient类(位于java.net.http包中),它支持同步和异步请求,并提供了更简洁的API。
HttpClient发送HTTP请求的使用说明:
创建HttpClient实例
HttpClient是线程安全的,建议全局创建一个实例并重复使用。
import java.net.http.HttpClient;
HttpClient httpClient = HttpClient.newHttpClient();
发送HTTP GET请求
同步请求
package org.example;
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 HttpClientExample {
public static void main(String[] args) {
HttpResponse<String> response;
try (HttpClient httpClient = HttpClient.newHttpClient()) {
// 创建请求
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.baidu.com/"))
.GET()
.build();
// 发送请求并获取响应
response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
// 输出响应
System.out.println("Status Code: " + response.statusCode());
System.out.println("Response Body: " + response.body());
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
异步请求
package org.example;
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 AsyncHttpClientExample {
public static void main(String[] args) {
CompletableFuture<HttpResponse<String>> future;
try (HttpClient httpClient = HttpClient.newHttpClient()) {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.baidu.com/"))
.GET()
.build();
// 异步发送请求
future = httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString());
}
// 处理异步响应
future.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join(); // 等待异步操作完成(仅用于示例,实际中可能不需要)
}
}
发送HTTP POST请求
发送JSON数据
package org.example;
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 PostRequestExample {
public static void main(String[] args) throws IOException, InterruptedException {
HttpClient httpClient = HttpClient.newHttpClient();
String jsonBody = "{\"title\": \"foo\", \"body\": \"bar\", \"userId\": 1}";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://jsonplaceholder.typicode.com/posts"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonBody))
.build();
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Status Code: " + response.statusCode());
System.out.println("Response Body: " + response.body());
}
}
处理请求头和响应头
添加自定义请求头
package org.example;
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 HeaderExample {
public static void main(String[] args) throws IOException, InterruptedException {
HttpClient httpClient = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.header("Authorization", "Bearer YOUR_TOKEN")
.header("User-Agent", "Java HttpClient")
.GET()
.build();
HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Content-Type: " + response.headers().firstValue("Content-Type").orElse(""));
}
}
处理超时和重定向
设置超时
HttpClient httpClient = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(10)) .build();
使用代理
HttpClient httpClient = HttpClient.newBuilder() .proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 8080))) .build();
注意事项
- Java版本要求:java.net.http.HttpClient需要Java 11或更高版本。
- 异常处理:发送请求时可能抛出IOException或InterruptedException,需捕获处理。
- 性能:HttpClient是线程安全的,适合高并发场景。
- 异步请求:使用sendAsync时,可通过CompletableFuture链式调用处理响应。
替代方案(Java 11之前)
如果使用Java 8或更早版本,可以考虑以下替代库:
- Apache HttpClient:功能强大,但需要额外依赖。
- OkHttp:轻量级且高效,适合移动和后端开发。
总结
- Java 11+:优先使用内置的java.net.http.HttpClient,支持同步/异步请求,功能完善。
- Java 8或更早:选择Apache HttpClient或OkHttp等第三方库。