Spring Framework 5.0新增的WebClient

64 篇文章 2 订阅
7 篇文章 0 订阅

Spring Framework 5.0 引入了 WebClient,这是一个新的非阻塞、响应式 Web 客户端 API,旨在为构建响应式微服务提供更好的支持。WebClient 是基于 Project Reactor 的响应式流 API 构建的,它可以高效地处理大量的并发请求,非常适合现代微服务架构。

WebClient 的主要特性

  • 响应式WebClient 基于非阻塞 I/O,可以处理大量的并发请求而不会阻塞线程。
  • 类型安全:API 设计为类型安全的,这有助于减少运行时错误。
  • 可定制:可以轻松地扩展和自定义 WebClient 的行为,例如添加拦截器、过滤器或自定义转换器。
  • 易于使用:提供了简洁的 API 来发起 HTTP 请求和处理响应。
  • 可测试性:提供了模拟 WebClient 的工具,便于编写单元测试。

使用示例

下面是一个简单的示例,展示了如何使用 WebClient 发送一个 GET 请求并处理 JSON 响应。

import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

public class WebClientExample {

    public static void main(String[] args) {
        // 创建 WebClient 实例
        WebClient webClient = WebClient.create();

        // 发送 GET 请求
        webClient.get()
                 .uri("http://example.com/api/data")
                 .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .bodyToMono(Data.class) // 假设 Data 是一个 Java 类
                 .subscribe(data -> {
                     System.out.println("Received data: " + data);
                 }, error -> {
                     System.err.println("Error occurred: " + error.getMessage());
                 }, () -> {
                     System.out.println("Request completed.");
                 });
    }

    // 假设这是从服务器接收的数据类
    static class Data {
        private String name;
        private int value;

        // Getters and setters
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return "Data{" +
                    "name='" + name + '\'' +
                    ", value=" + value +
                    '}';
        }
    }
}

WebClient 的基本用法

  1. 创建 WebClient 实例:可以使用 WebClient.create() 或者 WebClient.builder() 来创建 WebClient 实例。
  2. 构建请求:使用链式调用的方法来构建请求,例如 .get().uri("...").post().uri("...")
  3. 处理响应:使用 retrieve() 方法来处理响应。可以通过 .bodyToMono().bodyToFlux() 方法来转换响应体为 Mono 或 Flux。
  4. 订阅响应:使用 .subscribe() 方法来订阅 Mono 或 Flux 并处理数据。

自定义 WebClient

WebClient 可以通过多种方式来定制,例如添加拦截器、自定义转换器或设置超时时间等。

添加拦截器
WebClient webClient = WebClient.builder()
                               .filter((request, next) -> {
                                   // 自定义逻辑
                                   return next.exchange(request);
                               })
                               .build();
自定义转换器
WebClient webClient = WebClient.builder()
                               .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(16 * 1024 * 1024))
                               .build();

异常处理

WebClient 提供了内置的异常处理机制,可以使用 onStatus 方法来处理特定的状态码。

webClient.get()
         .uri("http://example.com/api/data")
         .retrieve()
         .onStatus(HttpStatus::is4xxClientError, clientResponse -> {
             // 处理 4xx 错误
             return clientResponse.bodyToMono(String.class)
                                  .map(body -> "Error: " + body);
         })
         .bodyToMono(Data.class)
         .subscribe(data -> {
             System.out.println("Received data: " + data);
         }, error -> {
             System.err.println("Error occurred: " + error.getMessage());
         }, () -> {
             System.out.println("Request completed.");
         });

总结

WebClient 是一个强大且灵活的工具,非常适合现代响应式应用程序的需求。它提供了丰富的功能,使得发起 HTTP 请求和处理响应变得非常简单。如果你正在开发响应式或微服务应用程序,WebClient 是一个很好的选择。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

svygh123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值