关注我的公众号:【编程朝花夕拾】,可获取首发内容。

01 引言
前面有两期总共介绍了四款工具,调用第三方API
像调用接口一样丝滑。
dromara
的Forest
SpringCloud
的OpenFeign
Spring6
的@HttpExchange
retrofit-spring-boot-starter
这种方式需要保证项目能够启动起来才可以,在单元测试的时候,需要保证项目能够跑起来,才能从临时的Spring
容器中获取到客户端,然后调用。
但是,平时开发中为了方便测试,有时候就想像main
方法一样直接调用,不想调试本地的环境。
那今天就推荐几款工具库!
02 工具库推荐
既然是工具,当然越方便越会受开发开发者喜爱。
2.1 Apache HttpClient
Apache
旗下的老牌、强大、灵活的 HTTP
客户端库。功能极其丰富,几乎可以处理所有复杂的 HTTP
场景,是许多企业和项目的历史选择。所谓Apache
出品必是精品。
测试URL:http://shanhe.kim/api/za/xingzuo.php?msg=双鱼座
案例
java
@Test
void apacheClient() {
// 1. 创建 HttpClient 对象
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 2. 创建 HTTP GET 请求
HttpGet httpGet = new HttpGet(BASE_URL);
// 3. 执行请求并获取响应
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
// 4. 获取响应实体
HttpEntity entity = response.getEntity();
if (entity != null) {
// 5. 将响应实体转换为字符串
String result = EntityUtils.toString(entity);
System.out.println(result);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
注意事项:
- 资源释放 :必须正确关闭
CloseableHttpClient
和CloseableHttpResponse
以释放网络连接资源,推荐使用try-with-resources
语句。 - 连接池管理 :在生产环境中,应配置和使用连接池 (
PoolingHttpClientConnectionManager
) 来提升性能。 - 复杂度:API 相对底层,配置项繁多,简单的请求写起来稍显繁琐。
如果你是 Spring
传统 MVC
项目且不想引入额外依赖,它是一个可靠的选择。
2.2 OkHttp
Square
公司开源的现代、高效、轻量级的 HTTP 客户端。默认支持 HTTP/2 和 WebSocket
,API
设计友好,是 Android 和许多开源项目的首选。
案例
java
@Test
void okClient() {
// 1. 创建 OkHttpClient 实例 (建议全局单例)
OkHttpClient client = new OkHttpClient();
// 2. 构建 Request 对象
Request request = new Request.Builder().url(BASE_URL).get().build();
// 3. 发起同步调用并接收响应
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful() && response.body() != null) {
// 4. 获取响应体字符串
String result = response.body().string();
System.out.println(result);
} else {
System.out.println("请求失败: " + response.code());
}
} catch (Exception e) {
e.printStackTrace();
}
}
注意事项:
- 单例模式 :
OkHttpClient
实例应共享同一个全局实例,因为它内部自己管理连接池和线程池,创建多个实例会浪费资源。 - 字符串转换 :
response.body().string()
只能调用一次,多次调用会抛出异常。如果需要多次读取,应先将其保存到变量中。
可以与 Retrofit 库(同样是 Square
出品)完美结合,用注解的方式将 HTTP API
转换为 Java
接口,极大地提升开发效率。
2.3 Spring
的 RestTemplate
Spring Framework
提供的用于同步 HTTP
请求的模板工具类。它简化了与 HTTP 服务的交互,并集成了 Spring 的生态(如消息转换器)。
注意:Spring 5 后已标记为渐退 (deprecated),推荐使用 WebClient
。
案例
java
@Test
void restTemplateClient() {
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject(BASE_URL, String.class);
System.out.println(result);
}
注意事项:
- 已过时:官方已不再积极开发新功能,未来版本会被移除。
- 同步阻塞:所有请求都是同步阻塞的,可能会影响高并发应用的性能。
- 错误处理 :默认情况下,对于
4xx/5xx
状态码会抛出异常,需要使用ResponseErrorHandler
进行自定义错误处理。
官方说明Spring 5.0
以后处于维护模式,只修改bug
,不再新增功能,推荐WebClient
。

然而在Spring 6.1
又推出了RestClient
,升级简直不要太快!

2.4 admin4j/common-http
admin4j/common-http
是 GitHub
上一个开源的 Java HTTP 客户端库。针对OKHttp
框架 封装了OkHttpUtil
工具类,使Http请求变得无比简单。
GitHub
地址:github.com/admin4j/com...
案例
java
@Test
void okUtil() throws IOException {
Response r = HttpUtil.get(BASE_URL, new Pair<>());
if (r.isSuccessful() && r.body() != null) {
System.out.println(r.body().string());
} else {
System.out.println("请求失败: " + r.code());
}
}
注意事项:
- 依赖与版本:这是一个第三方库,需要额外引入 Maven 依赖。使用时需关注其版本更新和兼容性。
- 学习成本与生态 :相比
OkHttp
或Spring
的客户端,它的社区规模和生态成熟度可能稍逊一筹。你需要花费一些时间阅读其专属文档来了解所有特性。
如果你厌倦了模板代码,希望用最简洁直观的方式完成HTTP通信,这个库都是非常好的选择。
2.5 Hutool
的HttpUtil
HttpUtil
是 Hutool
工具库中的一个组件,它封装了基于 JDK
的 HttpURLConnection
。其核心设计哲学是简化 和便捷 ,通过静态方法提供了极其简单的 API
,旨在用最少的代码完成最常见的 HTTP 请求任务,极大地提升了开发效率。
案例
java
@Test
void hutoolTest() {
String body = HttpUtil.get(BASE_URL);
System.out.println(body);
}
注意事项:
- 灵活性 :虽然简单,但对于一些极其复杂 的场景(如自定义SSL上下文、精细的连接超时和池化配置、拦截器等),
HttpUtil
的封装可能显得不够灵活。此时应选择更底层的库。 - 单例与连接池 :
HttpUtil
的静态方法内部会每次创建新的连接。对于需要复用连接的高性能场景,建议使用HttpRequest
类,并进行相关配置 - 高并发 :对于大型、高并发的生产环境,如果发现其性能成为瓶颈,可以考虑替换为
OkHttp
或Apache HttpClient
,但Hutool
在绝大多数场景下已经完全够用。
快速原型开发、小型项目、内部工具脚本、测试代码的绝对首选。没有什么比它更快捷。
2.6 Spring6
的RestClient
Spring5
引入的响应式、非阻塞的 HTTP 客户端,是 RestTemplate
的现代化替代品。它是 Spring WebFlux
的一部分,支持异步和流处理,资源占用更少,并发能力更强。
RestClient
是 Spring Framework 6.1
引入的一个新的同步 HTTP
客户端。它采用了现代 fluent API
(链式调用)设计,底层可以基于 WebClient
的非阻塞引擎,也可以适配其他HTTP库(如JDK HttpClient
)。它的目标是提供一种简单、直观且强大的方式来执行同步HTTP
请求,是 RestTemplate
的官方继任者。
这里我们以RestClient
为例。
案例
java
@Test
void webclientTest() {
String body = RestClient.create(BASE_URL)
.get()
.retrieve()
.body(String.class);
System.out.println(body);
}
注意事项:
- 版本要求 :需要
Spring Framework 6.1.0
或更高版本。对应 SpringBoot 3.2.0
或更高版本。 - 错误处理 :使用
.onStatus()
方法来针对特定的HTTP状态码提供自定义处理逻辑,比RestTemplate
的异常处理更加清晰和灵活。 - 灵活性 :虽然本身是同步的,但其底层实现可以是非阻塞的(如基于
WebClient
),这意味着它可以在响应式环境中高效运行,而使用者无需改变编程范式。 API
设计 :API
设计与WebClient
非常相似,降低了在同步和异步客户端之间切换的学习成本。
如果你正在开始一个新项目,并且不想使用响应式编程模型,RestClient
是最官方、最现代的选择。
03 小结
Java生态中HTTP客户端选择丰富,各有千秋。Spring开发者首选**RestClient
(同步)与 WebClien
t**(异步);追求轻量与性能可选**OkHttp
;极致开发效率推荐国产神器 Hutool
与 admin4j/common-http
;而复杂企业级场景仍可依赖老牌 Apache HttpClient
**。
这6款优秀的Http
客户端神奇,助你根据项目需求精准选型,高效完成网络请求任务,总有一款适合你。