
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、spring5 of webclient(轉(zhuǎn)載)spring5 of webclient(轉(zhuǎn)載)前言spring5帶來了新的響應(yīng)式web開發(fā)框架webflux,同時,也引入了新的httpclient框架webclient。webclient是spring5中引入的執(zhí)行 http 哀求的非堵塞、反應(yīng)式客戶端。它對同步和異步以及流計劃都有很好的支持,webclient發(fā)布后,resttemplate將在未來版本中棄用,并且不會向前添加主要新功能。webclient與resttemplate比較webclient是一個功能完美的http哀求客戶端,與resttemplate相比,webclient支
2、持以下內(nèi)容:非堵塞 i/o。反應(yīng)流背壓(消費者消費負載過高時主動反饋生產(chǎn)者放慢生產(chǎn)速度的一種機制)。具有高并發(fā)性,硬件資源消耗更少。流暢的api設(shè)計。同步和異步交互。流式傳輸支持http底層庫挑選spring5的webclient客戶端和webflux服務(wù)器都依靠于相同的非堵塞編解碼器來編碼和解碼哀求和響應(yīng)內(nèi)容。默認底層用法netty,內(nèi)置支持jetty反應(yīng)性httpclient實現(xiàn)。同時,也可以通過編碼的方式實現(xiàn)clienthttpconnector接口自定義新的底層庫;如切換jetty實現(xiàn):webclient.builder() .clientconnector(new jettyclie
3、nthttpconnector() .build(); webclient配置基礎(chǔ)配置webclient實例構(gòu)造器可以設(shè)置一些基礎(chǔ)的全局的web哀求配置信息,比如默認的cookie、header、baseurl等webclient.builder() .defaultcookie("test","t1") .defaulturivariables(immutablemap.of("name","kl") .defaultheader("
4、;header","kl") .defaultheaders(httpheaders -> httpheaders.add("header1","kl"); httpheaders.add("header2","kl"); ) .defaultcookies(cookie -> cookie.add("cookie1","kl&
5、;quot;); cookie.add("cookie2","kl"); ) .baseurl("http:/www.kailing.pub") .build(); 底層依靠netty庫配置通過定制netty底層庫,可以配置ssl平安銜接,以及哀求超時,讀寫超時等。這里需要注重一個問題,默認的銜接池最大銜接500。獵取銜接超時默認是45000ms,你可以配置成動態(tài)的銜接池,就可以突破這些默認配置,也可以按照業(yè)務(wù)自己制定。包括netty的select線程和工作線程也都可以自己設(shè)置。/配置動
6、態(tài)銜接池/connectionprovider provider = connectionprovider.elastic("elastic pool");/配置固定大小銜接池,如最大銜接數(shù)、銜接獵取超時、空閑銜接死亡時光等connectionprovider provider = connectionprovider.fixed("fixed", 45, 4000, duration.ofseconds(6);httpclient httpclient = httpclient.create(provider) .sec
7、ure(sslcontextspec -> sslcontextbuilder sslcontextbuilder = sslcontextbuilder.forclient() .trustmanager(new file("e:/server.truststore"); sslcontextspec.sslcontext(sslcontextbuilder); ).tcpconfiguration(tcpclient -> /指定netty的select 和 work線程數(shù)量 loopresources loop = loopresource
8、s.create("kl-event-loop", 1, 4, true); return tcpclient.doonconnected(connection -> /讀寫超時設(shè)置 connection.addhandlerlast(new readtimeouthandler(10, timeunit.seconds) .addhandlerlast(new writetimeouthandler(10); ) /銜接超時設(shè)置 .option(channeloption.connect_timeout_millis, 10000) .option(
9、channeloption.tcp_nodelay, true) .runon(loop); ); webclient.builder() .clientconnector(new reactorclienthttpconnector(httpclient) .build(); 編解碼配置針對特定的數(shù)據(jù)交互格式,可以設(shè)置自定義編解碼的模式,如下:exchangestrategies strategies = exchangestrategies.builder() .codecs(configurer -> configurer.customcodecs().decoder(new ja
10、ckson2jsondecoder(); configurer.customcodecs().encoder(new jackson2jsonencoder(); ) .build(); webclient.builder() .exchangestrategies(strategies) .build(); get哀求示例uri構(gòu)造時支持屬性占位符,真切參數(shù)在入?yún)r排序好就可以。同時可以通過accept設(shè)置媒體類型,以及編碼。終于的結(jié)果值是通過mono和flux來接收的,在subscribe辦法中訂閱返回值。webclient client = webclient.create(&q
11、uot;http:/www.kailing.pub");mono result = client.get() .uri("/article/index/arcid/id.html", 256) .acceptcharset(standardcharsets.utf_8) .accept(mediatype.text_html) .retrieve() .bodytomono(string.class); result.subscribe(system.err:println);假如需要攜帶復(fù)雜的查詢參數(shù),可以通過uricomponentsb
12、uilder構(gòu)造出uri哀求地址,如:/定義query參數(shù)multivaluemap params = new linkedmultivaluemap();params.add("name", "kl");params.add("age", "19");/定義url參數(shù)map urivariables = new hashmap();urivariables.put("id", 200);string uri = u
13、ricomponentsbuilder.fromuristring("/article/index/arcid/id.html")下載文件時,由于不清晰各種格式文件對應(yīng)的mime type,可以設(shè)置accept為mediatype.all,然后用法spring的resource來接收數(shù)據(jù)即可,如:webclient.create("https:/kk-open-public.oss-cn- .get() .accept(mediatype.all) .retrieve() .bodytomono(resource.class) .subsc
14、ribe(resource -> try file file = new file("e:/abcd.xlsx"); filecopyutils.copy(streamutils.copytobytearray(resource.getinputstream(), file); catch (ioexception ex) ); post哀求示例post哀求示例演示了一個比較復(fù)雜的場景,同時包含表單參數(shù)和文件流數(shù)據(jù)。假如是一般post哀求,挺直通過bodyvalue設(shè)置對象實例即可。不用forminserter構(gòu)造。webclient client =
15、 webclient.create("http:/www.kailing.pub");forminserter forminserter = frommultipartdata("name","kl") .with("age",19) .with("map",immutablemap.of("xx","xx") .with("f
16、ile",new file("e:/xxx.doc"); mono result = client.post() .uri("/article/index/arcid/id.html", 256) .contenttype(mediatype.application_json) .body(forminserter) /.bodyvalue(immutablemap.of("name","kl") .retrieve() .bodyt
17、omono(string.class); result.subscribe(system.err:println);同步返回結(jié)果上面演示的都是異步的通過mono的subscribe訂閱響應(yīng)值。固然,假如你想同步堵塞獵取結(jié)果,也可以通過.block()堵塞當(dāng)前線程獵取返回值。webclient client = webclient.create("http:/www.kailing.pub");string result = client .get() .uri("/article/index/arcid/id.html",
18、 256) .retrieve() .bodytomono(string.class) .block(); system.err.println(result);但是,假如需要舉行多個調(diào)用,則更高效地方式是避開單獨堵塞每個響應(yīng),而是等待組合結(jié)果,如:webclient client = webclient.create("http:/www.kailing.pub");mono result1mono = client .get() .uri("/article/index/arcid/id.html", 255) .re
19、trieve() .bodytomono(string.class); mono result2mono = client .get() .uri("/article/index/arcid/id.html", 254) .retrieve() .bodytomono(string.class); map map = mono.zip(result1mono, result2mono, (result1, result2) -> map arraylist = new hashmap(); arraylist.put("result1
20、", result1); arraylist.put("result2", result2); return arraylist; ).block();system.err.println(map.tostring();filter過濾器可以通過設(shè)置filter攔截器,統(tǒng)一修改攔截哀求,比如認證的場景,如下示例,filter注冊單個攔截器,filters可以注冊多個攔截器,basicauthentication是系統(tǒng)內(nèi)置的用于basicauth的攔截器,limitresponsesize是系統(tǒng)內(nèi)置用于限制響值byte大小的攔截器webclient.builder() .baseurl("http:/www.kailing.pub") .filter(request, next) -> clientrequest filtered = clientrequest.from(request) .header("foo", "bar")
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 物理復(fù)習(xí)計劃:九年級挑戰(zhàn)應(yīng)對
- 經(jīng)典自建房屋租賃合同與經(jīng)濟中介服務(wù)合同5篇
- 國營印刷廠企業(yè)勞動合同5篇
- 灌溉設(shè)備購銷合同5篇
- 2025年上海中英文租賃合同7篇
- 2025年標準礦用設(shè)備運輸車輛租賃合同
- 實習(xí)畢業(yè)生勞動合同范本
- 商場食品安全與衛(wèi)生合同
- 電子產(chǎn)品代理合同(六)
- 外匯質(zhì)押人民幣借款合同參考文本
- 2025湖北省建筑安全員考試題庫及答案
- 2025年《中央一號文件》參考試題庫資料100題及答案(含單選、多選、判斷題)
- 《影視照明技術(shù)》課件:照亮影視作品的靈魂
- 2023安徽省公務(wù)員考試【申論A卷、申論C卷、行測B類】 三套 真題及答案
- 《酒店前廳設(shè)計》課件
- 老年醫(yī)學(xué)科建設(shè)與發(fā)展
- 2025年貴州能礦錳業(yè)集團有限公司招聘筆試參考題庫含答案解析
- 公司積分制管理實施方案
- 2025年部編版道德與法治小學(xué)三年級下冊全冊教案(含教學(xué)計劃)
- 2023河南中醫(yī)藥大學(xué)學(xué)士學(xué)位英語題
- 中等職業(yè)學(xué)校英語教學(xué)大綱詞匯表本表共收詞2200個左右含
評論
0/150
提交評論