WebClient介绍
WebClient是Spring框架5.0引入的基于响应式编程模型的HTTP客户端。它提供一种简便的方式来处理HTTP请求和响应,支持异步和非阻塞式的请求和响应处理。
WebClient基于Reactor,它是一种响应式流编程框架,它提供了Publisher-Subscriber模型的API,允许异步、非阻塞的处理流式数据。
WebClient允许开发者通过构建链式的HTTP请求和响应处理函数来构建异步和非阻塞式的HTTP客户端。它支持多种HTTP方法、请求和响应处理、错误处理、HTTP认证和与RESTful服务交互。
WebClient具有以下优点:
- 响应式编程模型支持异步、非阻塞式请求和响应处理。
- 强类型安全的API,支持Fluent API风格。
- 支持函数式编程,可以方便地进行流式处理。
- 支持自定义配置,如连接池、超时时间等。
- 可以与Spring WebFlux框架集成使用。
WebClient是一种简便、灵活的方式来构建基于响应式编程模型的HTTP客户端。它是Spring WebFlux框架的核心组件之一,并促进了Spring与Reactor之间的集成。
一个简单的WebClient使用示例
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.reactive.function.client.WebClientResponseException;
public class ExampleWebClient {
public static void main(String[] args) {
WebClient client = WebClient.create("https://api.example.com");
client.get().uri("/users/1")
.retrieve()
.bodyToMono(String.class)
.doOnSuccess(response -> System.out.println(response))
.doOnError(WebClientResponseException.class, error -> {
System.err.println("Error status code: " + error.getRawStatusCode());
System.err.println("Error message: " + error.getResponseBodyAsString());
})
.block();
}
}
在这个示例中,我们首先创建了一个WebClient实例,并指定要请求的URI。在这里,我们假设API服务的地址是“https://api.example.com”。
随后,我们使用WebClient发送一个GET请求,并指定URI“/users/1”,这个URI将返回一个JSON格式的用户信息。
然后,我们触发请求,对响应进行处理。使用retrieve()方法触发请求,并将响应体转换为String类型的Mono对象,然后使用doOnSuccess()方法处理成功的响应,和doOnError()方法处理出现错误的情况。
如果出现WebClientResponseException类型的错误,则认为HTTP请求失败。在这种情况下,我们打印出状态码和错误信息。
最后,我们使用block()方法等待请求执行完成。
一个带有多个查询参数的WebClient使用示例
import org.springframework.web.reactive.function.client.WebClient;
public class ExampleWebClient {
public static void main(String[] args) {
WebClient client = WebClient.create("https://api.example.com");
client.get()
.uri(uriBuilder -> uriBuilder.path("/search")
.queryParam("q", "WebClient")
.queryParam("page", 1)
.queryParam("size", 20)
.build())
.retrieve()
.bodyToMono(String.class)
.subscribe(response -> System.out.println(response));
}
}
在这个示例中,我们使用了
uri()
方法来构建URI。使用了一个Lambda表达式,在其中的
uriBuilder
对象(
UriBuilder
类型)中指定了路径和查询参数。在这个例子中,我们将
/search
作为路径,以及三个查询参数
q
、
page
、
size
来进行搜索,它们的值依次为
WebClient
(表示搜索关键字为
WebClient
)、
1
、
20
。
最终的URI将会是一个类似于
https://api.example.com/search?q=WebClient&page=1&size=20
的字符串。在发送请求后,我们将响应体转换为String类型的Mono对象,并使用
subscribe()
方法输出响应内容。
一个POST请求,并传递Map参数,然后将响应转换为List数据的示例代码
WebClient webClient = WebClient.create();
Map<String, String> params = new HashMap<>();
params.put("name", "John");
params.put("age", "30");
Mono<List<SomeResponse>> response = webClient.post()
.uri("https://example.com/api/users")
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromValue(params))
.retrieve()
.bodyToFlux(SomeResponse.class)
.collectList();
response.subscribe(
result -> System.out.println(result.toString()),
error -> System.err.println("Error: " + error.getMessage()),
() -> System.out.println("Request completed.")
);
在上述代码中,我们首先创建了一个WebClient实例,并使用Map创建了一个包含参数的请求体。接着,我们使用post()方法创建一个POST请求,并指定请求的URI。然后,我们使用contentType()方法设置请求头的Content-Type为application/json,将请求体转换为JSON格式并使用body()方法设置到请求中。紧接着,我们使用retrieve()方法发送请求并获取响应体。
由于响应的数据是JSON数组格式的,我们使用bodyToFlux()方法将响应体转换为一个Flux,然后再使用collectList()方法将Flux中的元素合并为一个List对象。最后,我们使用subscribe()方法订阅响应结果。
在成功的处理函数中,我们将得到一个List类型的result,并将其打印到控制台上。在失败的处理函数中,我们将得到一个错误对象并将其错误信息打印到控制台上。在完成的处理函数中,我们打印出请求完成的消息。
版权归原作者 互联网那点事 所有, 如有侵权,请联系我们删除。