久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

WebClient怎么在Spring5中使用

這期內容當中小編將會給大家帶來有關WebClient怎么在Spring5中使用,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創新互聯是一家專注于成都網站設計、成都做網站與策劃設計,黔西南州網站建設哪家好?創新互聯做網站,專注于網站建設10年,網設計領域的專業建站公司;建站業務涵蓋:黔西南州等地區。黔西南州做網站價格咨詢:13518219792

前言

Spring5帶來了新的響應式web開發框架WebFlux,同時,也引入了新的HttpClient框架WebClient。WebClient是Spring5中引入的執行 HTTP 請求的非阻塞、反應式客戶端。它對同步和異步以及流方案都有很好的支持,WebClient發布后,RestTemplate將在將來版本中棄用,并且不會向前添加主要新功能。

WebClient與RestTemplate比較

WebClient是一個功能完善的Http請求客戶端,與RestTemplate相比,WebClient支持以下內容:

  • 非阻塞 I/O。

  • 反應流背壓(消費者消費負載過高時主動反饋生產者放慢生產速度的一種機制)。

  • 具有高并發性,硬件資源消耗更少。

  • 流暢的API設計。

  • 同步和異步交互。

  • 流式傳輸支持

HTTP底層庫選擇

Spring5的WebClient客戶端和WebFlux服務器都依賴于相同的非阻塞編解碼器來編碼和解碼請求和響應內容。默認底層使用Netty,內置支持Jetty反應性HttpClient實現。同時,也可以通過編碼的方式實現ClientHttpConnector接口自定義新的底層庫;如切換Jetty實現:

WebClient.builder()
        .clientConnector(new JettyClientHttpConnector())
        .build();

WebClient配置

基礎配置

WebClient實例構造器可以設置一些基礎的全局的web請求配置信息,比如默認的cookie、header、baseUrl等

WebClient.builder()
        .defaultCookie("kl","kl")
        .defaultUriVariables(ImmutableMap.of("name","kl"))
        .defaultHeader("header","kl")
        .defaultHeaders(httpHeaders -> {
          httpHeaders.add("header1","kl");
          httpHeaders.add("header2","kl");
        })
        .defaultCookies(cookie ->{
          cookie.add("cookie1","kl");
          cookie.add("cookie2","kl");
        })
        .baseUrl("http://www.kailing.pub")
        .build();

Netty庫配置

通過定制Netty底層庫,可以配置SSl安全連接,以及請求超時,讀寫超時等

HttpClient httpClient = HttpClient.create()
        .secure(sslContextSpec -> {
          SslContextBuilder sslContextBuilder = SslContextBuilder.forClient()
              .trustManager(new File("E://server.truststore"));
          sslContextSpec.sslContext(sslContextBuilder);
        }).tcpConfiguration(tcpClient -> {
          tcpClient.doOnConnected(connection ->
              //讀寫超時設置
              connection.addHandlerLast(new ReadTimeoutHandler(10, TimeUnit.SECONDS))
                  .addHandlerLast(new WriteTimeoutHandler(10))
          );
          //連接超時設置
          tcpClient.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000)
          .option(ChannelOption.TCP_NODELAY,true);
          return tcpClient;
        });

    WebClient.builder()
        .clientConnector(new ReactorClientHttpConnector(httpClient))
        .build();

編解碼配置

針對特定的數據交互格式,可以設置自定義編解碼的模式,如下:

ExchangeStrategies strategies = ExchangeStrategies.builder()
        .codecs(configurer -> {
          configurer.customCodecs().decoder(new Jackson2JsonDecoder());
          configurer.customCodecs().encoder(new Jackson2JsonEncoder());
        })
        .build();
    WebClient.builder()
        .exchangeStrategies(strategies)
        .build();

get請求示例

uri構造時支持屬性占位符,真實參數在入參時排序好就可以。同時可以通過accept設置媒體類型,以及編碼。最終的結果值是通過Mono和Flux來接收的,在subscribe方法中訂閱返回值。

WebClient client = WebClient.create("http://www.kailing.pub");
    Mono<String> result = client.get()
        .uri("/article/index/arcid/{id}.html", 256)
        .attributes(attr -> {
          attr.put("name", "kl");
          attr.put("age", "28");
        })
        .acceptCharset(StandardCharsets.UTF_8)
        .accept(MediaType.TEXT_HTML)
        .retrieve()
        .bodyToMono(String.class);
    result.subscribe(System.err::println);

post請求示例

post請求示例演示了一個比較復雜的場景,同時包含表單參數和文件流數據。如果是普通post請求,直接通過bodyValue設置對象實例即可。不用FormInserter構造。

WebClient client = WebClient.create("http://www.kailing.pub");
    FormInserter formInserter = fromMultipartData("name","kl")
        .with("age",19)
        .with("map",ImmutableMap.of("xx","xx"))
        .with("file",new File("E://xxx.doc"));
    Mono<String> result = client.post()
        .uri("/article/index/arcid/{id}.html", 256)
        .contentType(MediaType.APPLICATION_JSON)
        .body(formInserter)
        //.bodyValue(ImmutableMap.of("name","kl"))
        .retrieve()
        .bodyToMono(String.class);
    result.subscribe(System.err::println);

同步返回結果

上面演示的都是異步的通過mono的subscribe訂閱響應值。當然,如果你想同步阻塞獲取結果,也可以通過.block()阻塞當前線程獲取返回值。

   WebClient client = WebClient.create("http://www.kailing.pub");
   String result = client .get()
        .uri("/article/index/arcid/{id}.html", 256)
        .retrieve()
        .bodyToMono(String.class)
        .block();
    System.err.println(result);

但是,如果需要進行多個調用,則更高效地方式是避免單獨阻塞每個響應,而是等待組合結果,如:

   WebClient client = WebClient.create("http://www.kailing.pub");
    Mono<String> result1Mono = client .get()
        .uri("/article/index/arcid/{id}.html", 255)
        .retrieve()
        .bodyToMono(String.class);
    Mono<String> result2Mono = client .get()
        .uri("/article/index/arcid/{id}.html", 254)
        .retrieve()
        .bodyToMono(String.class);
    Map<String,String> map = Mono.zip(result1Mono, result2Mono, (result1, result2) -> {
      Map<String, String> arrayList = new HashMap<>();
      arrayList.put("result1", result1);
      arrayList.put("result2", result2);
      return arrayList;
    }).block();
    System.err.println(map.toString());

Filter過濾器

可以通過設置filter攔截器,統一修改攔截請求,比如認證的場景,如下示例,filter注冊單個攔截器,filters可以注冊多個攔截器,basicAuthentication是系統內置的用于basicAuth的攔截器,limitResponseSize是系統內置用于限制響值byte大小的攔截器

WebClient.builder()
        .baseUrl("http://www.kailing.pub")
        .filter((request, next) -> {
          ClientRequest filtered = ClientRequest.from(request)
              .header("foo", "bar")
              .build();
          return next.exchange(filtered);
        })
        .filters(filters ->{
          filters.add(ExchangeFilterFunctions.basicAuthentication("username","password"));
          filters.add(ExchangeFilterFunctions.limitResponseSize(800));
        })
        .build().get()
        .uri("/article/index/arcid/{id}.html", 254)
        .retrieve()
        .bodyToMono(String.class)
        .subscribe(System.err::println);

websocket支持

WebClient不支持websocket請求,請求websocket接口時需要使用WebSocketClient,如:

WebSocketClient client = new ReactorNettyWebSocketClient();
URI url = new URI("ws://localhost:8080/path");
client.execute(url, session ->
    session.receive()
        .doOnNext(System.out::println)
        .then());

上述就是小編為大家分享的WebClient怎么在Spring5中使用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創新互聯行業資訊頻道。

網頁名稱:WebClient怎么在Spring5中使用
網頁地址:http://www.js-pz168.com/article2/ihicic.html

成都網站建設公司_創新互聯,為您提供面包屑導航Google外貿建站ChatGPT網站策劃響應式網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都定制網站建設
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
欧美亚一区二区| 日本一区二区综合亚洲| 欧美激情在线一区二区| 午夜一区二区三区在线观看| 国产精品自拍三区| 国产区欧美区日韩区| 在线观看免费成人| 欧美—级在线免费片| 日本成人在线不卡视频| 91在线观看免费视频| 亚洲欧洲免费无码| 久久久亚洲精华液精华液精华液| 亚洲一区二区免费视频| 成人爽a毛片一区二区免费| 蜜桃狠狠色伊人亚洲综合网站| 欧美体内she精视频| 国产精品视频九色porn| 激情图片小说一区| 国语精品免费视频| 678五月天丁香亚洲综合网| 中文字幕乱码日本亚洲一区二区| 毛片不卡一区二区| 国产一区自拍视频| 7777精品伊人久久久大香线蕉经典版下载| 中文字幕一区二区三| 久久国产精品无码网站| 精品久久久久亚洲| 欧美一区二区在线播放| 亚洲国产视频在线| 91超碰在线免费观看| 在线国产亚洲欧美| 亚洲视频一二区| 成人激情文学综合网| 中文字幕成人一区| 一色屋精品亚洲香蕉网站| 国产精品99久久久久久似苏梦涵 | 一区二区三区精品久久久| 成人黄页在线观看| 在线观看欧美黄色| 亚洲精品视频在线看| 波多野洁衣一区| 在线看日韩精品电影| 亚洲欧美日韩国产一区二区三区| 丁香天五香天堂综合| 91激情在线视频| 亚洲欧美欧美一区二区三区| 成人一区在线看| 色婷婷久久久久swag精品| 亚洲欧洲一区二区在线播放| 丁香激情综合国产| 欧美又粗又大又爽| 一区二区三区久久| 动漫美女被爆操久久久| 制服丝袜激情欧洲亚洲| 热久久一区二区| 欧美一区二区高清在线观看| 国产色91在线| 粉嫩一区二区三区在线看| 日本精品裸体写真集在线观看| 国产精品成人免费精品自在线观看| 国产成人午夜99999| 欧洲色大大久久| 亚洲小少妇裸体bbw| 国产一区二区三区高清| 久久免费视频一区| 丰满亚洲少妇av| 精品视频在线免费看| 午夜精品久久久久久| 欧美不卡三区| 国产精品美女久久久久久2018| fc2成人免费人成在线观看播放| 欧美日韩免费高清一区色橹橹| 香蕉成人伊视频在线观看| 欧美精品一区二区三区在线四季| 国产欧美一区二区精品性| av午夜精品一区二区三区| 欧美一区二区日韩| 黄页视频在线91| 欧美主播一区二区三区| 五月激情综合色| 午夜精品美女久久久久av福利| 亚洲人成网站色在线观看| 国产精选在线观看91| 国产日产欧美一区二区视频| av电影在线观看一区| 精品欧美一区二区在线观看| 国产激情视频一区二区在线观看 | 欧美日韩国产在线观看| 狂野欧美性猛交blacked| 日本高清不卡视频| 日韩av不卡在线观看| 亚洲欧洲精品一区二区| 亚洲成av人片在www色猫咪| 日韩亚洲欧美精品| 亚洲一区二区综合| 日韩精品另类天天更新| 夜夜夜精品看看| 日本成人黄色免费看| 一区二区三区资源| 日本黑人久久| 亚洲国产一区二区三区青草影视| 日韩av影视| 亚洲国产成人av| 一区二区三区视频在线播放| 丝袜脚交一区二区| 一本久久a久久免费精品不卡| 日本最新不卡在线| 91成人免费在线视频| 久久av中文字幕片| 欧美人体做爰大胆视频| 国产一区中文字幕| 日韩欧美不卡在线观看视频| 成人一道本在线| 久久久久久久综合色一本| 99国产精品久久久久老师| 国产精品丝袜在线| 久久亚洲一区二区| 亚洲观看高清完整版在线观看| 亚洲高清视频一区| 麻豆国产91在线播放| 欧美日韩高清影院| 成人一区二区三区视频在线观看| 精品999在线播放| 波多野结衣久草一区| 亚洲色图制服诱惑| 亚洲色图自拍| 经典三级视频一区| 日韩一级免费一区| 91久久精品一区二区别| 亚洲欧洲色图综合| 香蕉久久夜色| 精品影院一区二区久久久| 欧美一区二区三区在线视频| 99re这里只有精品6| 国产精品久久一级| 无码免费一区二区三区免费播放| 日本特黄久久久高潮| 欧美日韩一区二区三区免费看| 福利一区二区在线| 国产精品色一区二区三区| 任我爽在线视频精品一| 免费美女久久99| 日韩欧美中文一区| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 成人黄色av网站在线| 亚洲国产成人一区二区三区| 欧美一区二视频在线免费观看| 日韩电影在线观看网站| 日韩一区二区在线免费观看| 都市激情久久久久久久久久久| 一区二区三区四区av| 欧美私模裸体表演在线观看| 波多野结衣在线aⅴ中文字幕不卡| 中文字幕成人网| 亚洲精品乱码视频| 国产成人免费视频网站高清观看视频 | 国产精品99久久不卡二区| 久久精品在线观看| 神马影院一区二区| 国产精品综合在线视频| 中文文精品字幕一区二区| 亚洲综合首页| 成人小视频在线| 亚洲人成7777| 精品视频资源站| 国产高清精品一区| 日韩av网站在线观看| 精品国产乱码久久久久久浪潮| 欧美日本韩国国产| 国产一区二区三区免费| 中文一区二区完整视频在线观看| 一区二区日本伦理| 97精品电影院| 午夜精品久久久久久久久久久| 日韩欧美国产一区在线观看| 玛丽玛丽电影原版免费观看1977| 精品一区二区三区香蕉蜜桃| 日本一区二区三区国色天香| 色综合咪咪久久| 91免费看网站| 免费视频一区二区| 国产欧美日韩综合| 欧美伊人久久大香线蕉综合69| 91久久精品www人人做人人爽| 偷拍自拍另类欧美| 国产三区在线成人av| 91久久精品一区二区三| 91网免费观看| 久久国产麻豆精品| 亚洲色图视频免费播放| 欧美丰满美乳xxx高潮www| 久久久久久亚洲精品不卡4k岛国 | 成人欧美一区二区三区黑人免费| 日本成人在线一区| 中文成人av在线| 欧美蜜桃一区二区三区| 欧美精品一区二区视频 | 欧美精品在线观看一区二区| 久久伊人一区| 成人高清在线视频|