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.pswp.cn/web/37714.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37714.shtml
英文地址,請注明出處:http://en.pswp.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; 注…