跳转到内容

HttpClient详解

在网络编程中,我们经常需要与其他服务进行通信,而 HTTP 是最常见的通信协议之一。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() 方法可以对客户端进行详细配置,支持链式调用,非常方便。

类型: String

默认值: null

服务地址,必填项。

类型: int

默认值: 80

服务端口。

类型: int

默认值: 0

连接超时时间,单位毫秒。设置为 0 表示永不超时。

类型: int

默认值: 1024

读缓冲区大小,单位:字节。合理的大小可以减少系统调用次数,提高性能。

类型: int

默认值: 1024

写缓冲区大小,单位:字节。合理的大小可以减少系统调用次数,提高性能。

类型: boolean

默认值: false

是否开启调试模式。启用后会在控制台打印请求和响应的详细信息,非常适合排查问题。

类型: ProxyOptions

默认值: null

代理配置,适用于需要通过代理服务器访问目标服务的场景。

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 提供了强大的异步回调机制,可以在请求发送后立即返回,而不需要等待请求完成。这对于构建高性能应用非常重要。

当响应 Header 解析完成后,会触发 onResponseHeader 回调。在这个回调中,你可以检查响应的状态码和头部信息:

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();
}
}

对于存在响应体的请求,当 onResponseHeader 回调结束并开始接收到 Body 内容时,会触发 onResponseBody 回调。

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();
}
}

onResponseBody 的参数是一个 Stream 对象,用于消费响应体的内容:

  • response: HttpResponse 对象,表示当前的响应。
  • bytes: 字节数组,表示接收到的响应体内容。
  • end: boolean 值,表示是否接收到了响应体的最后一部分内容。

当请求成功时,会触发 onSuccess 回调。该回调发生于 onResponseBody 正常结束之后。

当请求失败时,会触发 onFailure 回调。在这里你可以处理网络异常、超时等问题。

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

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

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

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

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

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