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

01 引言
前面有两期总共介绍了四款工具,调用第三方API像调用接口一样丝滑。
dromara的ForestSpringCloud的OpenFeignSpring6的@HttpExchangeretrofit-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(同步)与 WebClient**(异步);追求轻量与性能可选**OkHttp;极致开发效率推荐国产神器 Hutool与 admin4j/common-http;而复杂企业级场景仍可依赖老牌 Apache HttpClient**。
这6款优秀的Http客户端神奇,助你根据项目需求精准选型,高效完成网络请求任务,总有一款适合你。