spring?webClient配置及使用簡(jiǎn)單代碼示例
1.配置
import com.zty.common.util.WebUtils;
import io.netty.channel.ChannelOption;
import io.netty.handler.timeout.ReadTimeoutHandler;
import io.netty.handler.timeout.WriteTimeoutHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import reactor.netty.resources.ConnectionProvider;
import java.time.Duration;
/**
* WebClient配置
* @author zty
*/
@Slf4j
@Configuration
public class WebClientConfig {
@Bean
public WebClient webClient(){
//配置固定大小連接池
ConnectionProvider provider = ConnectionProvider
.builder("custom")
// 等待超時(shí)時(shí)間
.pendingAcquireTimeout(Duration.ofSeconds(10))
// 最大連接數(shù)
.maxConnections(200)
// 最大空閑時(shí)間
.maxIdleTime(Duration.ofSeconds(5))
// 最大等待連接數(shù)量
.pendingAcquireMaxCount(-1)
.build();
/**
* doOnBind 當(dāng)服務(wù)器channel即將被綁定的時(shí)候調(diào)用。
* doOnBound 當(dāng)服務(wù)器channel已經(jīng)被綁定的時(shí)候調(diào)用。
* doOnChannelInit 當(dāng)channel初始化的時(shí)候被調(diào)用。
* doOnConnection 當(dāng)一個(gè)遠(yuǎn)程客戶端連接上的時(shí)候被調(diào)用。
* doOnUnbound 當(dāng)服務(wù)器channel解綁的時(shí)候被調(diào)用。
*/
HttpClient httpClient = HttpClient.create(provider)
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 6000)
.option(ChannelOption.SO_KEEPALIVE, true)
.responseTimeout(Duration.ofSeconds(6))
.keepAlive(true)
//連接成功
.doOnConnected(connection -> connection.addHandlerLast(new ReadTimeoutHandler(6))
.addHandlerLast(new WriteTimeoutHandler(6)))
//每次請(qǐng)求后執(zhí)行flush,防止服務(wù)器主動(dòng)斷開連接
.doAfterRequest((httpClientRequest, connection) -> {
connection.channel().alloc().buffer().release();
connection.channel().flush();
connection.channel().pipeline().flush();
});
return WebClient.builder()
.baseUrl("http://127.0.0.1:8080")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.defaultHeader(HttpHeaders.CONNECTION, "keep-alive")
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
}
}2.使用
import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
import java.util.HashMap;
/**
* http消息發(fā)送工具
* @author zty
*/
@Slf4j
@Component
public class WebUtils {
@Autowired
WebClient webClient;
@Async
public void post(HashMap<String, Object> message){
// 發(fā)送請(qǐng)求
webClient.post()
// 請(qǐng)求路徑
.uri("/test")
// 攜帶參數(shù)
.bodyValue(JSON.toJSONString(message))
// 獲取響應(yīng)體
.retrieve()
// 響應(yīng)數(shù)據(jù)類型轉(zhuǎn)換
.bodyToMono(String.class)
.doOnError(throwable -> log.info(throwable.getMessage()))
.onErrorResume(e -> Mono.just("Error " + e.getMessage()))
// 異步
.subscribe();
}
}附:一個(gè)帶有多個(gè)查詢參數(shù)的WebClient使用示例
import org.springframework.web.reactive.function.client.WebClient;
public class ExampleWebClient {
public static void main(String[] args) {
WebClient client = WebClient.create("https://api.example.com");
client.get()
.uri(uriBuilder -> uriBuilder.path("/search")
.queryParam("q", "WebClient")
.queryParam("page", 1)
.queryParam("size", 20)
.build())
.retrieve()
.bodyToMono(String.class)
.subscribe(response -> System.out.println(response));
}
}
在這個(gè)示例中,我們使用了uri()方法來構(gòu)建URI。使用了一個(gè)Lambda表達(dá)式,在其中的uriBuilder對(duì)象(UriBuilder類型)中指定了路徑和查詢參數(shù)。在這個(gè)例子中,我們將/search作為路徑,以及三個(gè)查詢參數(shù)q、page、size來進(jìn)行搜索,它們的值依次為WebClient(表示搜索關(guān)鍵字為WebClient)、1、20。
最終的URI將會(huì)是一個(gè)類似于 https://api.example.com/search?q=WebClient&page=1&size=20 的字符串。在發(fā)送請(qǐng)求后,我們將響應(yīng)體轉(zhuǎn)換為String類型的Mono對(duì)象,并使用subscribe()方法輸出響應(yīng)內(nèi)容。
總結(jié)
到此這篇關(guān)于spring webClient配置及使用的文章就介紹到這了,更多相關(guān)spring webClient配置使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java并發(fā)編程之柵欄(CyclicBarrier)實(shí)例介紹
這篇文章主要介紹了Java并發(fā)編程之柵欄(CyclicBarrier)實(shí)例介紹,柵欄類似閉鎖,但是它們是有區(qū)別的,需要的朋友可以參考下2015-04-04
mybatis-plus調(diào)用update方法時(shí),自動(dòng)填充字段不生效問題及解決
這篇文章主要介紹了mybatis-plus調(diào)用update方法時(shí),自動(dòng)填充字段不生效問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
如何在Mac上安裝并配置JDK環(huán)境變量詳細(xì)步驟
這篇文章主要介紹了如何在Mac上安裝并配置JDK環(huán)境變量詳細(xì)步驟,包括下載JDK、安裝JDK、配置環(huán)境變量、驗(yàn)證JDK配置以及可選地設(shè)置PowerShell為默認(rèn)終端,需要的朋友可以參考下2025-04-04
配置idea將Java與數(shù)據(jù)庫連接起來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的圖書管理系統(tǒng)
這篇文章主要給大家介紹了關(guān)于配置idea將Java與數(shù)據(jù)庫連接起來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的圖書管理系統(tǒng)的相關(guān)資料,本文從基于Java的圖書管理系統(tǒng)的背景、系統(tǒng)設(shè)計(jì)、數(shù)據(jù)庫設(shè)計(jì)和系統(tǒng)實(shí)現(xiàn)等方面進(jìn)行了詳細(xì)的研究,需要的朋友可以參考下2023-12-12
Java springboot里注解大全和使用指南(最新整理)
在Java Spring Boot中,注解是簡(jiǎn)化開發(fā)、提高效率的關(guān)鍵工具,這篇文章給大家介紹Java springboot里注解大全和使用指南,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2026-03-03
Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之財(cái)務(wù)預(yù)算管理系統(tǒng)的實(shí)現(xiàn)
這是一個(gè)使用了java+SSM+Jsp+Mysql+Layui+Maven開發(fā)的財(cái)務(wù)預(yù)算管理系統(tǒng),是一個(gè)畢業(yè)設(shè)計(jì)的實(shí)戰(zhàn)練習(xí),具有財(cái)務(wù)預(yù)算管理該有的所有功能,感興趣的朋友快來看看吧2022-02-02

