SpringBoot3 实现webclient 通用方法

打印 上一主题 下一主题

主题 518|帖子 518|积分 1554

媒介:

Spring Boot WebClient 是 Spring Framework 5 中引入的一个新的响应式 Web 客户端,用于异步和响应式地与外部服务进行通信。它是基于 Project Reactor 的响应式编程模型构建的,提供了比传统的 RestTemplate 更现代和强盛的功能
先容:


  • 响应式编程模型:WebClient 是基于响应式编程模型的,这意味着它可以非壅闭地执行网络哀求,并且可以或许与流式数据交互。这使得 WebClient 在处置惩罚大量并发哀求时具有更高的性能和可伸缩性。
  • 异步操纵:WebClient 支持异步操纵,这意味着它可以在等待网络响应的同时继续执行其他任务。这有助于提高应用程序的响应本领和吞吐量。
  • 强盛的 API:WebClient 提供了一个简洁而强盛的 API,用于构建 HTTP 哀求和接收响应。它支持多种 HTTP 方法(如 GET、POST、PUT、DELETE 等),并提供了丰富的功能来处置惩罚哀求头、哀求体、响应体等。
  • 流式处置惩罚:WebClient 支持流式处置惩罚响应数据,这意味着它可以在接收响应数据的同时进行处置惩罚,而不必要将整个响应加载到内存中。这有助于处置惩罚大型响应数据,并淘汰内存使用。
  • 错误处置惩罚:WebClient 提供了强盛的错误处置惩罚机制,可以方便地处置惩罚网络哀求中出现的错误和异常情况。它支持自界说错误处置惩罚器,可以根据必要界说错误处置惩罚逻辑。
  • 集成性:WebClient 可以轻松地与 Spring Boot 的其他组件集成,如 Spring Data、Spring Security 等。这使得在构建基于微服务的响应式应用程序时更加方便和灵活。
  • 替代 RestTemplate:虽然 RestTemplate 在以前的 Spring 版本中广泛使用,但 WebClient 被视为其现代替代品。WebClient 提供了更强盛和灵活的功能,并且更得当与响应式编程模型一起使用
一、引包

  1. <parent>
  2.         <groupId>org.springframework.boot</groupId>
  3.         <artifactId>spring-boot-starter-parent</artifactId>
  4.         <version>3.0.0</version>
  5.     </parent>
  6. <dependencies>
  7.         <dependency>
  8.             <groupId>org.springframework.boot</groupId>
  9.             <artifactId>spring-boot-starter-web</artifactId>
  10.         </dependency>
  11.         <dependency>
  12.             <groupId>org.springframework.boot</groupId>
  13.             <artifactId>spring-boot-starter-tomcat</artifactId>
  14.         </dependency>
  15.         <dependency>
  16.             <groupId>org.springframework.boot</groupId>
  17.             <artifactId>spring-boot-starter-test</artifactId>
  18.             <scope>test</scope>
  19.         </dependency>
  20.           <dependency>
  21.             <groupId>org.springframework.boot</groupId>
  22.             <artifactId>spring-boot-starter-webflux</artifactId>
  23.         </dependency>
  24. </dependencies>
复制代码
二、通用方法

  1. package com.zc.util;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.http.MediaType;
  4. import org.springframework.stereotype.Component;
  5. import org.springframework.web.reactive.function.client.WebClient;
  6. import java.util.List;
  7. /**
  8. * @author zc
  9. * @date 2024/4/15 16:52
  10. * @desc
  11. */
  12. @Component
  13. public class WebClientUtil {
  14.     private final WebClient webClient;
  15.     @Autowired
  16.     public WebClientUtil(WebClient.Builder webClientBuilder) {
  17.          this.webClient = webClientBuilder.
  18.                 baseUrl("http://127.0.0.1:30003").
  19.                 build();
  20.     }
  21.     /**
  22.      * get方法
  23.      * @param url
  24.      * @param responseType
  25.      * @return
  26.      * @param
  27.      */
  28.     public <T> T get(String url, Class<T> responseType) {
  29.         return webClient.get().
  30.                 uri(url).
  31.                 accept(MediaType.APPLICATION_JSON).
  32.                 retrieve().
  33.                 bodyToMono(responseType).
  34.                 block();
  35.     }
  36.     /**
  37.      * get多条数据
  38.      * @param url
  39.      * @param responseType
  40.      * @return
  41.      * @param <T>
  42.      */
  43.     public <T> List<T> list(String url, Class<T> responseType){
  44.         return webClient.get().
  45.                 uri(url).
  46.                 accept(MediaType.APPLICATION_JSON).
  47.                 retrieve().
  48.                 bodyToFlux(responseType).collectList().block();
  49.     }
  50.     /**
  51.      * post方法
  52.      * @param url
  53.      * @param requestBody
  54.      * @param responseType
  55.      * @return
  56.      * @param
  57.      */
  58.     public <T> T post(String url, Object requestBody, Class<T> responseType) {
  59.         return webClient.post().
  60.                 uri(url).
  61.                 contentType(MediaType.APPLICATION_JSON).
  62.                 bodyValue(requestBody).
  63.                 accept(MediaType.APPLICATION_JSON).
  64.                 retrieve().
  65.                 bodyToMono(responseType).
  66.                 block();
  67.     }
  68.     /**
  69.      * put方法
  70.      * @param url
  71.      * @param requestBody
  72.      * @param responseType
  73.      * @return
  74.      * @param
  75.      */
  76.     public <T> T put(String url, Object requestBody, Class<T> responseType){
  77.         return webClient.put().
  78.                 uri(url).
  79.                 contentType(MediaType.APPLICATION_JSON).
  80.                 bodyValue(requestBody).
  81.                 accept(MediaType.APPLICATION_JSON).
  82.                 retrieve().
  83.                 bodyToMono(responseType).
  84.                 block();
  85.     }
  86.     /**
  87.      * 删除方法
  88.      * @param url
  89.      * @param responseType
  90.      * @return
  91.      * @param
  92.      */
  93.     public <T> T delete(String url, Class<T> responseType){
  94.         return webClient.delete().
  95.                 uri(url).
  96.                 accept(MediaType.APPLICATION_JSON).
  97.                 retrieve().
  98.                 bodyToMono(responseType).
  99.                 block();
  100.     }
  101. }
复制代码
三、测试

客户端:
  1. import com.alibaba.fastjson.JSON;
  2. import com.zc.Application;
  3. import com.zc.bean.HostDiffBean;
  4. import com.zc.util.WebClientUtil;
  5. import org.junit.jupiter.api.Test;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.boot.test.context.SpringBootTest;
  8. import java.util.Date;
  9. import java.util.List;
  10. /**
  11. * @author zc
  12. * @date 2024/2/23 10:40
  13. * @desc
  14. */
  15. @SpringBootTest(classes = Application.class)
  16. public class TestFF {
  17.     @Autowired
  18.     private WebClientUtil webClientUtil;
  19.     @Test
  20.     public void test(){
  21.         List<HostDiffBean> list= webClientUtil.list("compare/hostInfo?pageSize=10&pageNum=1", HostDiffBean.class);
  22.         System.out.println(JSON.toJSON(list));
  23.         HostDiffBean hostDiffBean = new HostDiffBean();
  24.         hostDiffBean.setIp("127.0.0.1");
  25.         hostDiffBean.setHIp("127.0.0.2");
  26.         hostDiffBean.setCreateTime(new Date());
  27.         hostDiffBean.setSerialNumber("123");
  28.         hostDiffBean.setHDeviceNo("no123");
  29.         hostDiffBean.setDeviceNo("NO456");
  30.         String result = webClientUtil.post("compare/hostInfo/add", hostDiffBean, String.class);
  31.         System.out.println(result);
  32.     }
  33. }
复制代码
服务端:
  1. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  2. import com.neusoft.bean.*;
  3. import com.neusoft.service.HostDataCompareService;
  4. import io.swagger.annotations.*;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.validation.annotation.Validated;
  7. import org.springframework.web.bind.annotation.*;
  8. import java.util.List;
  9. /**
  10. * @author zc
  11. * @date 2024/3/14 15:00
  12. * @desc
  13. */
  14. @RestController
  15. @RequestMapping("/compare")
  16. @Api(value = "数据对比接口", tags = "数据对比接口")
  17. public class DataCompareController {
  18.     @Autowired
  19.     private HostDataCompareService hostDataCompareService;
  20.     @GetMapping("/hostInfo")
  21.     @ApiOperation(value = "宿主机数量差异查询", notes = "宿主机数量差异查询")
  22.     public List<HostInfoBean> getHostInfoBeans(@RequestParam(name = "pageSize") @Validated @ApiParam(value = "每页数", required = true) Integer pageSize,
  23.                                                @RequestParam(name = "pageNum") @Validated @ApiParam(value = "页数", required = true) Integer pageNum) {
  24.         Page<HostInfoBean> list = hostDataCompareService.getHostInfoBeans(pageSize, pageNum);
  25.         return list.getRecords();
  26.     }
  27.     @PostMapping("/hostInfo/add")
  28.     @ApiOperation(value = "宿主机数量差异查询", notes = "宿主机数量差异查询")
  29.     public String addHostInfoBeans(@RequestBody HostDiffBean hostDiffBean){
  30.         return "success";
  31.     }
  32. }
复制代码
结果:


四、参考

SpringBoot - 网络哀求客户端WebClient使用详解_springboot webclient-CSDN博客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

八卦阵

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表