SpringBoot整合WebClient进行Http远程调用

使用WebClient进行Http远程调用

文章目录

    • 使用WebClient进行Http远程调用
      • 1.WebClient对象创建
      • 2.WebClient对象抽取config配置
      • 3.Get请求url参数设置
      • 4.获取ResponseEntity对象
      • 5.Post请求
      • 测试示例代码

  • WebClient 一旦创建,就是不可修改的,如果需要设置默认值,可以借助 mutate 继承当前webclient的属性,再进行扩展
  • subscribe方式获取的是webFlux接口返回的数据 ans.subscribe(s -> System.out.println("create return: " + s));
  • 传统接口使用block阻塞获取内容
  • GET请求 webClient.get().uri(xxx).retrieve().bodyToMono/bodyToFlux,分别获取Mono和Flux数据
  • bodyToMono用于获取0个或1个元素,而bodyToFlux对象获取1个或多个元素

引入webFlux依赖

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

1.WebClient对象创建

       /*** WebClient 创建,* 1.create创建WebClient实例* 2.build创建WebClient实例(可以设置请求头等参数)* 3.mutate 方式 在一个已经存在的WebClient基础上,再创建一个满足自定义需求的WebClient* 发起get请求,并将返回的数据格式转换为String;因为是异步请求,所以返回的是Mono包装的对象*/WebClient webClient= WebClient.create();Mono<String> ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx").retrieve().bodyToMono(String.class);System.out.println("create return: " + ans.block());webClient= WebClient.create();Flux<String> an1 = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/xxx").retrieve().bodyToFlux(String.class);an1.toStream().forEach(System.out::println);webClient = WebClient.builder().defaultHeader("User-Agent", "WebClient Agent").build();ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx").retrieve().bodyToMono(String.class);System.out.println("builder return: " + ans.block());webClient = webClient.mutate().defaultCookie("cookie", "aaa").build();ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx").retrieve().bodyToMono(String.class);System.out.println("mutate return: " + ans.block());

2.WebClient对象抽取config配置

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;@Configuration
public class WebClientConfig {@Beanpublic WebClient webClient() {return WebClient.builder()//默认基础地址,配置后后续请求可以不加.baseUrl("http://127.0.0.1:12000").defaultHeader("Content-Type", "application/json").defaultHeader("Accept", "application/json").build();}
}
    @Autowiredprivate WebClient webClient;

3.Get请求url参数设置

       //url参数ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/wechat/xxx/info?year={a}",1).retrieve().bodyToMono(String.class);System.out.println("create return: " + ans.block());//map映射url参数Map<String, Object> uriVariables = new HashMap<>();uriVariables.put("a", 1);uriVariables.put("b", "测试");ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx?action=arrival&isYear={a}&keyword={b}",uriVariables).retrieve().bodyToMono(String.class);System.out.println("create return: " + ans.block());

4.获取ResponseEntity对象

        //获取 ResponseEntityMono<ResponseEntity<String>> response = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx").exchange().flatMap(r -> r.toEntity(String.class));ResponseEntity<String> entity = Objects.requireNonNull(response.block());System.out.println(" headers: " + entity.getHeaders() + " body: " + entity.getBody());

5.Post请求

//表单参数webClient = WebClient.create("http://127.0.0.1:12000");MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();formData.add("name", "张三");formData.add("age", "18");ans = webClient.post().uri("/post").bodyValue(formData).retrieve().bodyToMono(String.class);System.out.println("post formData ans " + ans.block());// json参数UserObj userObj = new UserObj("张三",18);ans = webClient.post().uri("/body").contentType(MediaType.APPLICATION_JSON).bodyValue(userObj).retrieve().bodyToMono(String.class);System.out.println("post formData ans " + ans.block());

测试示例代码

import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;import java.util.HashMap;
import java.util.Map;
import java.util.Objects;/*** WebClient 一旦创建,就是不可修改的,如果需要设置默认值,可以借助 mutate 继承当前webclient的属性,再进行扩展* subscribe方式获取的是webFlux接口返回的数据 ans.subscribe(s -> System.out.println("create return: " + s));* 传统接口使用block阻塞获取内容* GET请求  webClient.get().uri(xxx).retrieve().bodyToMono/bodyToFlux,分别获取Mono和Flux数据*/
public class WebClientTest {public static void main(String[] args) {/*** WebClient 创建,* 1.create创建WebClient实例* 2.build创建WebClient实例(可以设置请求头等参数)* 3.mutate 方式 在一个已经存在的WebClient基础上,再创建一个满足自定义需求的WebClient* 发起get请求,并将返回的数据格式转换为String;因为是异步请求,所以返回的是Mono包装的对象*/WebClient webClient= WebClient.create();Mono<String> ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx").retrieve().bodyToMono(String.class);System.out.println("create return: " + ans.block());webClient= WebClient.create();Flux<String> an1 = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/xxx").retrieve().bodyToFlux(String.class);an1.toStream().forEach(System.out::println);webClient = WebClient.builder().defaultHeader("User-Agent", "WebClient Agent").build();ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx").retrieve().bodyToMono(String.class);System.out.println("builderCreate with header return: " + ans.block());webClient = webClient.mutate().defaultCookie("ck", "--web--client--ck--").build();ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx").retrieve().bodyToMono(String.class);System.out.println("webClient#mutate with cookie return: " + ans.block());/*** url参数设置* 1.url可变参数* 2.map映射url参数*///url可变参数ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/wechat/xxx/info?year={a}",1).retrieve().bodyToMono(String.class);System.out.println("create return: " + ans.block());//map映射url参数Map<String, Object> uriVariables = new HashMap<>();uriVariables.put("a", 1);uriVariables.put("b", "测试");ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx?action=arrival&isYear={a}&keyword={b}",uriVariables).retrieve().bodyToMono(String.class);System.out.println("create return: " + ans.block());//获取 ResponseEntityMono<ResponseEntity<String>> response = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx").exchange().flatMap(r -> r.toEntity(String.class));ResponseEntity<String> entity = Objects.requireNonNull(response.block());System.out.println("res headers: " + entity.getHeaders() + " body: " + entity.getBody());/*** post请求* 1.表单* 2.json数据*///表单参数webClient = WebClient.create("http://127.0.0.1:12000");MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();formData.add("name", "张三");formData.add("age", "18");//默认的ContentType就是"application/x-www-form-urlencoded",所以下面这个contentType是可以不显示设置的ans = webClient.post().uri("/post")// .contentType(MediaType.APPLICATION_FORM_URLENCODED).bodyValue(formData).retrieve().bodyToMono(String.class);System.out.println("post formData ans " + ans.block());// json参数UserObj userObj = new UserObj("张三",18);ans = webClient.post().uri("/body").contentType(MediaType.APPLICATION_JSON).bodyValue(userObj).retrieve().bodyToMono(String.class);System.out.println("post formData ans " + ans.block());}}

参考原文:https://blog.csdn.net/cxyxysam/article/details/135425646

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/37714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DP:子数组问题

文章目录 引言子数组问题介绍动态规划的基本概念具体问题的解决方法动态规划解法&#xff1a;关于子数组问题的几个题1.最大子数组和2.环形子数组的最大和3.乘积最大子数组4.乘积为正数的最长子数组长度5.等差数列划分 总结 引言 介绍动态规划&#xff08;DP&#xff09;在解决…

音视频开发31 FFmpeg 编码- avcodec_find_encoder和avcodec_find_encoder_by_name

avcodec_find_encoder /** * Find a registered encoder with a matching codec ID. * * param id AVCodecID of the requested encoder * return An encoder if one was found, NULL otherwise. */ AVCodec *avcodec_find_encoder(enum AVCodecID id); 那么这个 AVCodec…

14分Top刊NC代码开源|NSCLC单细胞+空转肿瘤微环境分析

说在前面 说起肺癌真的过去回忆历历在目&#xff0c;小编毕业后职业生涯的第一个项目——非小细胞肺癌预后有效靶点筛选。当时肝的是转录组预后建模筛选。 做研发其实要求是远远高于发文章的&#xff0c;文章投不出去就降分&#xff0c;加工作量&#xff0c;做药要是烂尾或者…

2024年7月1日 (周一) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键&#xff0c;实现一键唤起、一键隐藏的 Windows 工具&#xff0c;并且支持窗口动态绑定快捷键&#xff08;无需设置自动实现&#xff09;。 喜马拉雅下载工具: 字面意思 《星刃》早期概念图分享 末世破败环境推主Genki分享了《星…

Spire.PDF for .NET【文档操作】演示:在 PDF 中创建目录 (TOC)

目录在增强文档的可读性和可导航性方面起着至关重要的作用。它为读者提供了文档结构的清晰概述&#xff0c;使他们能够快速找到并访问他们感兴趣的特定部分或信息。这对于较长的文档&#xff08;例如报告、书籍或学术论文&#xff09;尤其有价值&#xff0c;因为读者可能需要多…

部署calico网络插件

部署calico网络插件 之前的k8s环境中主要使用了flannel作为网络插件&#xff0c;这次改用calico。calico支持多种安装方式&#xff0c;以下是具体的操作步骤。 1. 准备工作 环境信息 # 系统信息 rootmaster1:~# cat /etc/issue Ubuntu 24.04 LTS \n \lrootmaster1:~# uname…

MyBatisPlus 常用的注解 表映射 主键映射 字段映射

介绍 官网&#xff1a;https://baomidou.com/reference/annotation/ 指定映射表 实体类使用驼峰命名&#xff0c;表名应为xx_xxx等格式这样才可以映射&#xff0c;但是实际开发过程中可能不一致就可以使用该方法处理。 Data TableName("employee_235") //映射的表…

求质数题目

//需求:键盘录入一个正整数x&#xff0c;判断该整数是否为一个质数。 //质数: //如果一个整数只能被1和本身整除&#xff0c;那么这个数就是质数。否则这个数叫做合数 package Base_se.Base_701;import java.util.Scanner;/*** author gyf* ClassName test* Date 2024/7/1 19:…

Linux启动elasticsearch,提示权限不够

Linux启动elasticsearch&#xff0c;提示权限不够&#xff0c;如下图所示&#xff1a; 解决办法&#xff1a; 设置文件所有者&#xff0c;即使用户由权限访问文件 sudo chown -R 用户名[:新组] ./elasticsearch-8.10.4 //切换到elasticsearch-8.10.4目录同级 chown详细格式…

银行家算法-操作系统中避免死锁的最著名算法

背景 有很多文章都会介绍银行家算法。在百度和CSDN上搜一搜能搜出很多来。很多同学会觉得这个算法很深奥&#xff0c;有些文章写的又很复杂&#xff0c;其实真的很简单。这里简单记录一下基本原理&#xff0c;然后大家再配合其他文章看&#xff0c;就能加深理解。 算法原理 …

LLaVA1.5训练数据和时间分析

LLaVA的PT+SFT训练_llava sft-CSDN博客文章浏览阅读379次。这个阶段,使用8个A100(80G)训练LLaVA-v1.5-13B大约需要20h。全量微调,非lora跑不起来啊,以前一直用swift,llama-factory这种框架式的代码库,但用原作者开源的代码也是有很多好处的。在这个阶段,使用 8 个 A100(…

Oracle中 ROW_NUMBER()的语法及在对应不同需求下应如何使用

Oracle数据库中的ROW_NUMBER()函数是一个窗口函数&#xff0c;它为查询结果集中的每一行分配一个唯一的序号。这个函数在数据分析、分页查询、数据去重和排名问题等方面非常有用。ROW_NUMBER()函数的语法如下&#xff1a; ROW_NUMBER() OVER ( [ PARTITION BY column ] ORDER …

3.用户程序与驱动交互

驱动程序请使用第二章https://blog.csdn.net/chenhequanlalala/article/details/140034424 用户app与驱动交互最常见的做法是insmod驱动后&#xff0c;生成一个设备节点&#xff0c;app通过open&#xff0c;read等系统调用去操作这个设备节点&#xff0c;这里先用mknode命令调…

64.WEB渗透测试-信息收集- WAF、框架组件识别(4)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;63.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;3&#xff09;-CSDN博客 我们在…

【FedMut】Generalized Federated Learning via Stochastic Mutation

基于随机变异的泛化联邦学习 来源&#xff1a;AAAI2024 Abstract 问题&#xff1a; FedAvg 将相同的全局模型派发给客户端进行本地训练&#xff0c;容易陷入尖锐解&#xff0c;导致训练出性能低下的全局模型 提出 FedMut&#xff1a; 本文提出了一种名为 FedMut 的新型FL方法…

2024免费的股票数据接口API

沧海数据 # Restful API https://tsanghi.com/api/fin/stock/{exchange_code}/realtime?token5dbb47113a4a43a6be1755673ce854db&ticker{ticker} 数据来源&#xff1a;沧海数据 请求方式&#xff1a;Get 数据格式&#xff1a;标准Json格式[{},...{}]

如何借用物联网快速实现高标准农田信息化

如何借用物联网快速实现高标准农田信息化 高标准农田信息化&#xff0c;作为现代农业发展的重要基石&#xff0c;是指在建设高产、稳产、节水、环保的农田基础上&#xff0c;深度融合现代信息技术&#xff0c;实现农田管理的精准化、智能化和高效化。物联网&#xff08;Intern…

vue3+ts实现计算两个字符串的相似度

在TypeScript中&#xff0c;可以使用Levenshtein莱文斯坦距离算法来精确匹配两个字符串的相似度百分比。Levenshtein距离是指两个字符串之间&#xff0c;由一个转换成另一个所需的最少编辑操作次数&#xff0c;这里的编辑操作包括插入、删除、替换。 /*** Levenshtein距离算法…

Linux Static calls机制

文章目录 前言一、简介二、Background: indirect calls, Spectre, and retpolines2.1 Indirect calls2.2 Spectre (v2)2.3 RetpolinesConsequences 2.4 Static callsHow it works 三、其他参考资料 前言 Linux内核5.10内核版本引入新特性&#xff1a;Static calls。 Static c…

JAVA各版本-安装教程

目录 Java安装包下载 Java安装步骤 Java环境配置 Java安装包下载 到Oracle官网下载自己需要的版本 Oracle Java下载&#xff1a;Java Archive | Oracle Hong Kong SAR, PRC 下拉选择自己需要的版本&#xff08;本教程以Windows环境下&#xff0c;JAVA11为例&#xff09; 注…