跳转到内容

HttpClient 详解

Feat HttpClient 是一个功能强大、灵活且高效的 HTTP 客户端库,旨在帮助开发者轻松发送 HTTP 请求、处理响应。无论你是要调用第三方 API,还是构建微服务间的通信,HttpClient 都能胜任。

在开始使用 Feat HttpClient 之前,我们需要先引入相关依赖。

在 Maven 项目中,添加以下依赖到 pom.xml

<dependency>
<groupId>tech.smartboot.feat</groupId>
<artifactId>feat-core</artifactId>
<version>${feat.version}</version>
</dependency>

万事开头难,让我们从一个简单的例子开始。下面的示例展示了如何使用 Feat HttpClient 发送 GET 请求并处理响应:

import tech.smartboot.feat.core.client.HttpClient;
import java.io.IOException;
public class HttpClientDemo {
public static void main(String[] args) throws IOException {
// 创建 HttpClient 实例
HttpClient client = new HttpClient("https://www.baidu.com");
// 发送 GET 请求
client.get().onSuccess(response -> {
// 处理响应
System.out.println("Status Code: " + response.statusCode());
System.out.println("Body: " + response.body());
}).submit();
}
}

是不是很简单?接下来我们会深入了解 HttpClient 的各种功能。


HttpClient 提供了两种实例化方式,让你可以根据不同的场景选择最适合的方式。

方式一:完整的请求URL

这种方式最为直观,只需要传入完整的 URL 即可:

HttpClient client = new HttpClient("http://127.0.0.1:8080");
HttpClient client = new HttpClient("https://smartboot.tech/feat/");

HttpClient 会自动解析 URL 中的 host 和 port 信息,并识别是否使用 HTTPS 协议。

方式二:指定 host、port

如果你更喜欢分别指定主机和端口,也可以这样:

HttpClient httpClient = new HttpClient("127.0.0.1", 8080);
HttpClient httpClient = new HttpClient("smartboot.tech", 443);

这两种方式各有优势,你可以根据实际需求选择。


通过 HttpClient.options() 方法可以对客户端进行详细配置,支持链式调用。

配置项类型默认值说明
hostStringnull服务地址,必填项
portint80服务端口
connectTimeoutint0连接超时时间(毫秒),0 表示永不超时
readBufferSizeint1024读缓冲区大小(字节)
writeBufferSizeint1024写缓冲区大小(字节)
debugbooleanfalse是否开启调试模式
proxyProxyOptionsnull代理配置

HttpClient 提供了多种方式来发送 HTTP 请求,满足不同的使用场景。

HttpClient 提供了 rest() 方法用于发送通用的 HTTP 请求。rest() 方法的参数包括:

  • method: HTTP 请求方法,如 GET、POST、PUT、DELETE 等。
  • path: 请求路径,如 /api/user。

请求构造完毕后,需要调用 submit() 方法发送请求。

HttpRestDemo.java
public class HttpRestDemo {
public static void main(String[] args) throws IOException {
// 创建 HttpClient 实例
HttpClient client = new HttpClient("https://smartboot.tech");
client.options().debug(true);
// 发送 GET 请求
client.rest(HttpMethod.GET, "/feat/").onSuccess(response -> {
System.out.println("Status Code: " + response.statusCode());
System.out.println("Body: " + response.body());
}).submit();
}
}

对于 GET、POST 等常见的 HTTP 请求方法,HttpClient 提供了对应的方法,如 get()post() 等,使用起来更加直观:

HttpGetDemo.java
public class HttpGetDemo {
public static void main(String[] args) {
HttpClient httpClient = new HttpClient("https://smartboot.tech");
httpClient.get("/feat/")
.onSuccess(response -> System.out.println(response.body()))
.onFailure(Throwable::printStackTrace)
.submit();
}
}

HttpClient 提供了强大的异步回调机制,可以在请求发送后立即返回,而不需要等待请求完成。

回调方法触发时机用途
onResponseHeader响应 Header 解析完成后检查状态码和头部信息
onResponseBody接收到 Body 内容时流式处理响应体
onSuccess请求成功完成时处理完整响应
onFailure请求失败时处理异常、超时
ResponseHeaderDemo.java
public class ResponseHeaderDemo {
public static void main(String[] args) {
HttpClient httpClient = new HttpClient("https://smartboot.tech");
httpClient.get("/feat/")
.onResponseHeader(response -> {
for (String name : response.getHeaderNames()) {
System.out.println(name + ": " + response.getHeader(name));
}
})
.submit();
}
}
ResponseBodyDemo.java
public class ResponseBodyDemo {
public static void main(String[] args) {
HttpClient httpClient = new HttpClient("https://smartboot.tech");
httpClient.get("/feat/")
.onResponseBody(new Stream() {
@Override
public void stream(HttpResponse response, byte[] bytes, boolean end) throws IOException {
System.out.println("接收到数据:" + new String(bytes));
if (end) {
System.out.println("数据接收完毕");
}
}
})
.submit();
}
}

在使用 HttpClient 时,有一些最佳实践可以帮助你写出更好的代码:

  1. 合理设置超时时间:避免请求无限期挂起
  2. 正确处理异常:使用 onFailure 回调处理各种异常情况
  3. 复用 HttpClient 实例:避免频繁创建和销毁客户端实例
  4. 使用连接池:对于高并发场景,合理配置连接池参数
  5. 启用调试模式:在开发和调试阶段,可以开启 debug 模式查看详细日志

通过这篇文章,我们学习了 Feat HttpClient 的核心功能:

  1. 如何实例化 HttpClient
  2. 如何配置客户端选项
  3. 如何发送各种类型的 HTTP 请求
  4. 如何使用异步回调处理响应

HttpClient 的设计兼顾了易用性和功能性,无论是简单场景还是复杂需求都能很好地满足。掌握了这些知识,你就可以在项目中灵活运用 HttpClient 来处理各种 HTTP 通信需求了。

有关完整示例,请参见 HttpClient 测试代码