网站首页 > 技术文章 正文
在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-06-12 《我的世界》迎15周年,Java+ 基岩版游戏国区五折售44.5元
- 2025-06-12 我的Java!越过山丘(越过山丘杨宗纬完整版)
- 2025-06-12 我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊
- 2025-06-12 Java反射+注解实现Entity类与Dto类相互转换
- 2025-06-12 Java开发200+个学习知识路线-史上最全(框架篇)
- 2025-06-12 年末将至,Java 开发者必须了解的 15 个Java 顶级开源项目
- 2025-06-12 Java实现 10 万+并发去重,持续优化
- 2025-06-12 java+上传整个文件夹的所有文件(java实现文件上传的三种方式)
- 2025-06-12 系列教材JAVA+J2SE+JSP+SSH+javaWEB+框架+CMS+SQL 免费教材分享
- 2025-06-12 Java让你遥遥领先的7个编程习惯(java编程100例)
- 06-13C++之类和对象(c++中类和对象的区别)
- 06-13C语言进阶教程:数据结构 - 哈希表的基本原理与实现
- 06-13C语言实现见缝插圆游戏!零基础代码思路+源码分享
- 06-13Windows 10下使用编译并使用openCV
- 06-13C语言进阶教程:栈和队列的实现与应用
- 06-13C语言这些常见标准文件该如何使用?很基础也很重要
- 06-13C语言 vs C++:谁才是编程界的“全能王者”?
- 06-13C语言无锁编程指南(c语言锁机代码)
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)