跳转到内容

HttpClient详解 🌐

Feat HttpClient 是一个功能强大、灵活且高效的 HTTP 客户端库,旨在帮助开发者轻松发送 HTTP 请求、处理响应,并支持多种高级功能。它支持常见的 HTTP 方法(如 GET、POST、PUT、DELETE 等),并提供了灵活的配置选项,以满足不同场景下的需求。

Feat HttpClient 的设计理念注重性能、易用性和扩展性,能够与 Feat 框架的其他组件无缝集成,为开发者提供一致的开发体验。

快速上手

引入依赖

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

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

发送第一个 GET 请求

以下是一个简单的示例,展示了如何使用 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());
}).done();
}
}

HttpClient 实例化

HttpClient 提供了 2 种实例化方式:

方式一:完整的请求URL

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

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

方式二:指定 host、port

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

Options 配置

通过 HttpClient.options() 方法提供了客户端的配置选项,支持链式调用。

host

类型: String

默认值: null

服务地址,必填

port

类型: int

默认值: 80

服务端口

connectTimeout

类型: int

默认值: 0

连接超时时间,单位毫秒

readBufferSize

类型: int

默认值: 1024

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

writeBufferSize

类型: int

默认值: 1024

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

debug

类型: boolean

默认值: false

是否开启调试模式。启用后会在控制台打印请求和响应的详细信息。

proxy

类型: ProxyOptions

默认值: null

代理配置。

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 解析完成后,会触发 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();
}
}

onResponseBody

对于存在响应体的请求,当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

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

onFailure

当请求失败时,会触发 onFailure 回调。