网站首页 > 技术文章 正文
在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等第三方库。
猜你喜欢
- 2025-09-03 厉害,GitHub上标星90.7K「Java学习+面试指南」
- 2025-09-03 GitHub上堪称神级的Java技术栈手册火了,看完拿38K妥妥的
- 2025-09-03 Java大数据开发是做什么的?要掌握哪些技能
- 2025-09-03 Java 25 在 JEP 519 中集成了紧凑对象头
- 2025-09-03 超全 Java 毕设选题大集合,总有一款适合你!
- 2025-09-03 Java实现10万+并发去重,持续优化
- 2025-09-03 JAVA面试|重载和重写的区别_重载和重写的区别,面向对象的三个特性
- 2025-09-03 【推荐】一款基于 Java + Vue 开源的全响应式的智能安全决策系统
- 2025-09-03 JAVA入门-入门案列+代码_java代码例子讲解
- 2025-09-03 Java 性能优化的 50 个细节(珍藏版)
- 最近发表
-
- 聊一下 gRPC 的 C++ 异步编程_grpc 异步流模式
- [原创首发]安全日志管理中心实战(3)——开源NIDS之suricata部署
- 超详细手把手搭建在ubuntu系统的FFmpeg环境
- Nginx运维之路(Docker多段构建新版本并增加第三方模
- 92.1K小星星,一款开源免费的远程桌面,让你告别付费远程控制!
- Go 人脸识别教程_piwigo人脸识别
- 安卓手机安装Termux——搭建移动服务器
- ubuntu 安装开发环境(c/c++ 15)_ubuntu安装c++编译器
- Rust开发环境搭建指南:从安装到镜像配置的零坑实践
- Windows系统安装VirtualBox构造本地Linux开发环境
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (77)
- vector线程安全吗 (73)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)
