Spring Framework 5.0新增的WebClient
创始人
2024-11-14 11:34:44
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 是一个很好的选择。

相关内容

热门资讯

实测交流透视挂!宝玛大厅ai智... 实测交流透视挂!宝玛大厅ai智能透视挂教程,宝玛大厅破解软件经验(本来有挂辅助)1、每一步都需要思考...
总算了解辅助器!朱雀吴江三缺一... 总算了解辅助器!朱雀吴江三缺一ai智能透视辅助挂技巧,朱雀吴江三缺一好像是有挂(有辅助挂细节)朱雀吴...
今日公布透视!九五至尊大厅ai... 今日公布透视!九五至尊大厅ai智能透视插件,九五至尊大厅有没有透视挂窍门(切实有挂技术)1、在九五至...
玩家必看科普开挂!聚闲麻将ai... 玩家必看科普开挂!聚闲麻将ai智能透视辅助挂软件,聚闲麻将总是真的有挂(有辅助挂方式)聚闲麻将能透视...
据报道开挂!旅游娱乐ai智能开... 据报道开挂!旅游娱乐ai智能开挂工具,旅游娱乐辅助工具演示(一直有挂教学)1、全新机制【旅游娱乐ai...
一分钟揭秘开挂!决胜朋来麻将a... 一分钟揭秘开挂!决胜朋来麻将ai智能透视辅助挂教程,决胜朋来麻将真是真的是有挂(有辅助挂总结)1、首...
如何分辨真伪透视!红牛ai智能... 如何分辨真伪透视!红牛ai智能透视攻略,红牛是不是有挂经验(真是有挂技术)1、操作简单,无需红牛手机...
2分钟细说辅助器!江湖大庆麻将... 2分钟细说辅助器!江湖大庆麻将ai智能透视辅助挂攻略,江湖大庆麻将竟然是真的有挂(有辅助挂头条)1、...
总算清楚透视挂!老夫子厅ai智... 总算清楚透视挂!老夫子厅ai智能透视挂技巧,老夫子厅怎么开挂课程(好像发现有挂)老夫子厅破解侠是真的...
解密关于辅助!菜鸟麻将ai智能... 解密关于辅助!菜鸟麻将ai智能透视辅助挂脚本,菜鸟麻将总是存在有挂(有辅助挂存在)1、用户打开应用后...