Spring WebClient介绍
作者:mmseoamin日期:2023-12-13

WebClient介绍

WebClient是Spring框架5.0引入的基于响应式编程模型的HTTP客户端。它提供一种简便的方式来处理HTTP请求和响应,支持异步和非阻塞式的请求和响应处理。

WebClient基于Reactor,它是一种响应式流编程框架,它提供了Publisher-Subscriber模型的API,允许异步、非阻塞的处理流式数据。

WebClient允许开发者通过构建链式的HTTP请求和响应处理函数来构建异步和非阻塞式的HTTP客户端。它支持多种HTTP方法、请求和响应处理、错误处理、HTTP认证和与RESTful服务交互。

WebClient具有以下优点:

  1. 响应式编程模型支持异步、非阻塞式请求和响应处理。
  2. 强类型安全的API,支持Fluent API风格。
  3. 支持函数式编程,可以方便地进行流式处理。
  4. 支持自定义配置,如连接池、超时时间等。
  5. 可以与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 params = new HashMap<>();
params.put("name", "John");
params.put("age", "30");
Mono> 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,并将其打印到控制台上。在失败的处理函数中,我们将得到一个错误对象并将其错误信息打印到控制台上。在完成的处理函数中,我们打印出请求完成的消息。