java http请求推荐用jdk11+内置httpclient,支持get/post、json处理、认证头、异常重试;需设超时、解析响应、捕获io/中断异常,并避免硬编码敏感信息。

Java 实现 HTTP 接口请求,核心是选择合适的方式发起网络请求并处理响应。现代 Java 开发中,推荐优先使用 HttpClient(JDK 11+ 内置) 或成熟的第三方库如 OkHttp、Apache HttpClient。下面以最轻量、无需额外依赖的 JDK 内置 HttpClient 为主,结合常见场景给出可直接运行的实战写法。
发送 GET 请求并读取 JSON 响应
适用于调用公开 API(如天气、用户信息等),重点在于构造请求、设置超时、解析响应体。
- 使用
HttpClient.newBuilder()创建客户端,建议统一配置连接/读取超时 - 用
HttpRequest.newBuilder()构建请求,URL 需为完整地址(含协议和路径) - 响应体默认是字节流,需用
BodyHandlers.ofString()转为字符串,再用 Jackson 或 Gson 解析 JSON - 注意捕获
IOException和InterruptedException,后者需主动恢复中断状态
示例代码片段:
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(5))
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://jsonplaceholder.typicode.com/posts/1"))
.GET()
.build();
<p>HttpResponse<string> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() == 200) {
System.out.println(response.body()); // 输出 JSON 字符串
}</string></p>
发送 POST 请求提交 JSON 数据
向后端接口提交结构化数据(如创建用户、提交表单),关键在设置请求头、序列化请求体。
- 必须显式设置
Content-Type: application/json,否则服务端可能拒绝或解析失败 - 请求体用
HttpRequest.BodyPublishers.ofString()包装 JSON 字符串 - 推荐将 Java 对象先用 Jackson 的
ObjectMapper转为 JSON 字符串,避免手动拼接 - 检查返回状态码(如 201 表示创建成功),再处理响应内容
示例(假设已定义 User 类):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
ObjectMapper mapper = new ObjectMapper();
String jsonBody = mapper.writeValueAsString(new User("Alice", "alice@example.com"));
<p>HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("<a href="https://www.php.cn/link/dc076eb055ef5f8a60a41b6195e9f329">https://www.php.cn/link/dc076eb055ef5f8a60a41b6195e9f329</a>"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonBody))
.build();</p><p>HttpResponse<string> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Status: " + response.statusCode());
System.out.println("Body: " + response.body());</string></p>
处理带请求头和 Cookie 的认证请求
调用需要登录态或 Token 验证的接口时,需在请求中携带认证信息。
- Token 类型接口:通过
Authorization: Bearer <token></token>传递 JWT - Session 类型接口:从登录响应中提取
Set-Cookie,后续请求复用Cookie头 - JDK HttpClient 不自动管理 Cookie,如需持久化,可手动提取响应头中的
Set-Cookie并在下个请求中添加Cookie头 - 敏感信息(如密码、Token)避免硬编码,应从环境变量或配置文件读取
简单 Token 认证示例:
String token = System.getenv("API_TOKEN"); // 或从配置读取
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/profile"))
.header("Authorization", "Bearer " + token)
.header("Accept", "application/json")
.GET()
.build();
异常与重试的基本处理策略
真实网络环境不稳定,需应对超时、连接拒绝、服务端错误等场景。
- 超时异常(
ConnectException、SocketTimeoutException)说明网络层问题,适合重试 - HTTP 状态码 4xx 表示客户端错误(如 401 未授权、404 不存在),通常不重试
- 5xx 表示服务端错误,可考虑有限次数重试(如最多 2 次,间隔 1 秒)
- 简单重试可用循环 +
Thread.sleep(),生产环境建议用 Resilience4j 或自定义指数退避逻辑
基础重试示例(最多尝试 3 次):
for (int i = 0; i response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 200 && response.statusCode() = 500) {
Thread.sleep(1000L * (i + 1)); // 递增等待
continue;
}
break; // 4xx 不重试
} catch (IOException | InterruptedException e) {
if (i == 2) throw e;
Thread.sleep(1000);
}
}
不复杂但容易忽略:始终关闭资源不是必须(HttpClient 和 HttpRequest 是无状态对象),但响应体字符串已加载到内存,无需额外关闭;若用流式处理大响应,才需关注 BodyHandler 的资源释放。实际项目中,建议封装成工具类,统一处理日志、超时、错误码映射和 JSON 序列化。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










