spring-boot之webflux簡單入門 - 中

前言
昨天我們通過一個簡單實例,演示了webflux與WebMVC的簡單區(qū)別,同時也展示了webflux的基本工作流程,今天我來繼續(xù)學(xué)習(xí)webflux的相關(guān)知識。
今天我們學(xué)習(xí)的重點是webflux的客戶端,我們想通過webflux客戶端來了解webflux的相關(guān)基礎(chǔ)知識,包括接口請求方式、響應(yīng)類別、傳參等
webflux客戶端
簡單示例
webflux的客戶端用起來很方便,也很簡單,我們先看這樣一段代碼:
WebClient client = WebClient.create("http://localhost:8999");
Mono<String> stringMono = client.get()
.uri("/webflux/hi")
.attribute("name", "syske")
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(String.class);
String block = stringMono.block();
System.out.println("返回結(jié)果:" + block);
第一行代碼就是實例化一個weClient對象,需要注意的是,這里實例化的時候,也可以不指定服務(wù)器地址,如果不指定服務(wù)器地址的話,就需要我們在uri方法中指定完整的接口地址:
WebClient client = WebClient.create();
Mono<String> stringMono = client.get()
.uri("http://localhost:8999/webflux/hi")
···
如果不指定服務(wù)器地址,且uri填寫相對接口地址,則會報如下錯誤信息:
示例講解
下面我們就來詳細解釋下上面webfluxClient的代碼。
請求類型
client.get()表示創(chuàng)建一個get請求對象(本質(zhì)上是一個RequestHeadersUriSpec對象),他還支持post、put、delete和options,也就是我們restful的所有協(xié)議。

對于不同的請求類型,我們配置的請求參數(shù)是不一樣的,但是uri方法都是通用的。
get客戶端配置
當然,還有很多配置項是不一樣的,在上面的示例中,我們是get請求,我們可以配置如下參數(shù):
請求地址中的參數(shù):也就是 url中的參數(shù),可以通過attributes方法設(shè)置
Mono<String> stringMono = client.get()
.uri("/webflux/hi")
.attribute("name", "syske")
···
cookie信息
Mono<String> stringMono = client.get()
.uri("/webflux/hi")
.cookie("syske", "yyds")
···
響應(yīng)頭的字符編碼
Mono<String> stringMono = client.get()
.uri("/webflux/hi")
.acceptCharset(Charset.defaultCharset())
···
設(shè)置響應(yīng)類型
也就是我們常用的媒體類型,包括application/json、application/pdf、text/html、image/jpeg等待
Mono<String> stringMono = client.get()
.uri("/webflux/hi")
.accept(MediaType.APPLICATION_JSON)
···
獲取響應(yīng)設(shè)置對象
Mono<String> stringMono = client.get()
.uri("/webflux/hi")
.retrieve()
···
配置響應(yīng)對象
這里配置的類型要與服務(wù)器端對應(yīng),否則會在類型轉(zhuǎn)換時報錯
Mono<String> stringMono = client.get()
.uri("/webflux/hi")
.bodyToMono(String.class);
···
執(zhí)行調(diào)用,獲取響應(yīng)數(shù)據(jù)
經(jīng)過我的測試,我發(fā)現(xiàn)真正調(diào)用服務(wù)器是在我們執(zhí)行block方法之后,之前的操作都是未來配置客戶端請求數(shù)據(jù)。
String block = stringMono.block();
post客戶端配置
對于post配置,除了我們前面和get一樣的配置外(get的都支持),它還支持以下參數(shù):
設(shè)置請求頭類型
Mono<String> stringMono2 = client.post()
.uri("/webflux/hi")
.acceptCharset(Charset.defaultCharset())
.header("token:1234567")
.contentType(MediaType.APPLICATION_JSON)
設(shè)置其他請求頭信息
Mono<String> stringMono2 = client.post()
.uri("/webflux/hi")
.headers(httpHeaders -> {
httpHeaders.add(HttpHeaders.ACCEPT_CHARSET, "UTF-8");
})
好了,客戶端的相關(guān)配置就先到這里吧,下面簡單測試下。
測試
下面我們分別運行get和post兩種客戶端,訪問我們的兩個接口,看下效果。
首選是我們的接口,第一個是get接口,第二個是post接口:

接口路由配置

測試代碼如下
public static void main(String[] args) {
WebClient client = WebClient.create("http://localhost:8999");
Mono<String> stringMono = client.get()
.uri("/webflux/hi")
.acceptCharset(Charset.defaultCharset())
.header("token:1234567")
.cookie("syske", "yyds")
.attribute("name", "syske")
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(String.class);
String block = stringMono.block();
System.out.println("返回結(jié)果:" + block);
Mono<String> stringMono2 = client.post()
.uri("/webflux/hi2")
.acceptCharset(Charset.defaultCharset())
.header("token:1234567")
.headers(httpHeaders -> {
httpHeaders.add(HttpHeaders.ACCEPT_CHARSET, "UTF-8");
})
.contentType(MediaType.APPLICATION_JSON)
.cookie("syske", "yyds")
.attribute("name", "syske")
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(String.class);
String block1 = stringMono2.block();
System.out.println("block1" + block1);
}
然后運行下看看:


可以看到我們前面設(shè)置的數(shù)據(jù)都可以拿到,比如cookie、contentType。
下面是運行結(jié)果:


總結(jié)
今天時間有點緊張,搞了一天企業(yè)微信isv環(huán)境,現(xiàn)在環(huán)境還是時好時壞
,而且中午時間也比較緊張,所以webflux的相關(guān)內(nèi)容也就沒梳理完,不過webfluxClient也算基本上分享完了,明天繼續(xù)來分享webflux其他相關(guān)知識。
