当前位置: 首页 > news >正文

Spring boot3-WebClient远程调用非阻塞、响应式HTTP客户端

来吧,会用就行具体理论不讨论

1、首先pom.xml引入webflux依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

别问为什么因为是响应式.......都说不管理论了,继续 


2、创建WebClientController控制器

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import com.atguigu.boot3_07_http.service.WebClientService;

@RestController
public class WebClientController {

    @Autowired
    private WebClientService webClientService;// 等下创建真正干活的service类

/**
     * 博主这里对接的是华为云的人脸API获取token的测试,用什么api测试都是大同小异的
     *  WebClient 
     * @param authWrapper 请求体消息,有华为云要的key,id,scecc,password,name啥啥的,根据自己的api要求来就行
     * @return
     */
@PostMapping("/huawei")
    public Mono<String> huawei(@RequestBody(required = false) AuthWrapper authWrapper) {
        if (authWrapper == null) {
            return Mono.just("请求体不能为空"); // 返回错误信息
        }
        return webClientService
                .webClient("https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens", authWrapper) //这里放接口地址和参数,当然authWrapper实际项目是从数据库拿的
                .onErrorResume(e -> {
                    // 处理其他可能的异常
                    return Mono.just("发生错误:" + e.getMessage());
                });
    }

}

3、创建打工仔程序员WebClientService 类

import com.atguigu.boot3_07_http.entity.AuthWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

@Service
public class WebClientService {

    public Mono<String> webClient(String url, AuthWrapper authWrapper) {
        //远程调用
        //1、创建WebClient
        WebClient client = WebClient.create();

        //2.编辑请求
        return client.post()
                .uri(url)
                // .contentType(MediaType.APPLICATION_JSON) //和.header()一样的不用重复,推荐用.header自定义头部
                .bodyValue(authWrapper) //请求体参数
                .header("Content-Type", "application/json") //Content-Type字段,json格式,具体看api有要求请求头不
                .retrieve()
                //.bodyToMono(String.class) // 获取响应体的JSON数据并转换为String类型的Mono对象
                .toBodilessEntity()  // 应为博主测试的api返回的是响应头,所有不关注响应体
                .map(response -> {
                    String token = response.getHeaders().getFirst("X-Subject-Token");//获取字段X-Subject-Token响应头消息
                    if (token == null) {
                        // 不抛出异常,而是返回错误信息
                        return "错误:未获取到华为云Token";
                    }
                    return token;
                    //或者if去掉,用Objects.requireNonNullElse() //对象不为空输出:参数1,为空输出:参数2
//                    return Objects.requireNonNullElse(token, "错误:未获取到华为云Token");
                });
    }

}

最后看下返回结果,华为云返回的token


好啦,WebClient远程调用非阻塞、响应式HTTP客户端

最后大家有没有觉得,比RestTemplate传统的方便很多,但是没有实现高可用,有新的请求还有要搞一堆,我们使用 Http Interface: 声明式编程(官方推荐,也是很多大型项目的用法),并且创建工厂接口,这样只用写一次,以后需要的不用api可用直接调用,我也同时更新出来了

相关文章:

  • 数字电子技术基础(二十七)——输入端电阻的负载特性
  • electron 安装报错:RequestError: certificate has expired
  • 第14章 kali linux(网络安全防御实战--蓝军武器库)
  • 「JavaScript深入」理解 Object.defineProperty 与 Proxy
  • 每日一题之能量晶石
  • cursor中git提交记录出现 签出(已分离)
  • 反射、 Class类、JVM的类加载机制、Class的常用方法
  • 每日OJ_牛客_过桥_贪心+BFS_C++_Java
  • 51单片机汇编工程建立、仿真、调试全过程
  • 江科大51单片机笔记【15】直流电机驱动(PWM)
  • 图解AUTOSAR_CP_TcpIp
  • BFS比DFS更好理解「翻转二叉树」
  • 元宇宙与数字孪生
  • 基于Python懂车帝汽车数据分析平台(源码+lw+部署文档+讲解),源码可白嫖!
  • 《HTML + CSS + JS 打造炫酷轮播图详解》
  • 01 | Go 项目开发极速入门课介绍
  • C语言实现冒泡排序,超详解
  • 贝叶斯分层回归(Bayesian Hierarchical Regression)是一种基于贝叶斯统计理论的数据分析方法
  • TDengine SQL 函数
  • 《基于机器学习的DDoS攻击检测与防御系统设计与实现》开题报告
  • 邯郸一酒店办婚宴发生火灾,新郎母亲:饭没吃成酒店还要收费
  • 可量产9MWh超大容量储能系统亮相慕尼黑,宁德时代:大储技术迈入新时代
  • 涨知识|没想到吧,体育老师强调的运动恢复方法是错的?
  • 经济日报整版聚焦“妈妈岗”:就业路越走越宽,有温度重实效
  • 中华人民共和国和俄罗斯联邦关于进一步加强合作维护国际法权威的联合声明
  • 纪录片《中国》原班人马打造,《船山先生》美学再升级