<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 一、WebFlux概述 WebFlux是Spring5引入的一種基于響應式非阻塞IO編程模型的,替代SpringMVC基于Servlet編程模型的一種新技術; WebFlux底層實現是久經考驗的netty非阻塞IO通信框架; 響應式非阻塞IO模型的核心意義在于:提高了單位時間內有限資源下的服務請求的并發處理能力,而不是縮短了單個服務請求的響應時長; WebClient是與響應式編程配套的Spring 5客戶端框架; ## 二、基本方法 ### **創建WebClient** * `WebClient.create()` * `WebClient.create(String baseUrl)`:指定了baseUrl,使用該客戶端發送請求都基于baseUrl * `WebClient.builder()`返回一個WebClient.Builder,該對象可以做鏈式調用,傳遞更多的參數 ### **URL傳參方法** 數字順序占位符: ``` Mono<String> mono = webClient.uri("/{1}/{2}", "posts", "1") ``` 參數名稱占位符: ``` String type = "posts"; int id = 1; Mono<String> mono = webClient.uri("/{type}/{id}", type, id) ``` 通過map傳參: ``` Map<String,Object> map = new HashMap<>(); map.put("type", "posts"); map.put("id", 1); Mono<String> mono = webClient.uri("/{type}/{id}", map) ``` ## 三、獲取響應體 ### **block()阻塞式獲取響應結果** 在請求發送之后使用block()方法,阻塞當前線程等待獲取響應結果,就是阻塞式獲取響應結果; 單個對象用: ``` mono.block() ``` 例如: ``` Mono<PostDTO> mono = webClient.get().uri("/posts/1").retrieve().bodyToMono(PostDTO.class); System.out.println(mono.block()); ``` 或者列表對象用: ``` flux.collectList().block() ``` 例如: ``` Flux<PostDTO> flux = webClient.get().uri("/posts").retrieve() .bodyToFlux(PostDTO.class); List<PostDTO> posts = flux.collectList().block(); System.out.println("獲取posts集合元素數量:" + posts.size()); ``` ### **subscribe()非阻塞式獲取響應結果** 與block()阻塞式獲取響應結果不同,使用subscribe()異步訂閱響應結果,不會阻塞主線程繼續向下執行。獲取到響應結果之后,由回調函數handleResponse處理響應結果; ``` public void testSubscribe() throws InterruptedException { Mono<PostDTO> mono = webClient.get().uri("/posts/1").retrieve().bodyToMono(PostDTO.class); mono.subscribe(GetTest::handleResponse); } //響應結果處理回調方法 private static void handleResponse(PostDTO postDTO) { System.out.println("handle response:======================="); System.out.println(postDTO); } ``` ## 四、獲取HTTP響應完整內容 retrieve()只能獲取HTTP報文中的Body,也就是響應體。如果我們想獲取HTTP報文中的狀態碼、headers、cookies等信息,需要使用exchange()方法; ``` @Test public void testExchange() { Mono<ClientResponse> mono = webClient.get().uri("/posts/1").exchange(); System.out.println(mono.block()); // 獲取完整的響應對象 ClientResponse response = mono.block(); assert response != null; HttpStatus httpStatus = response.statusCode(); // 獲取響應狀態 int statusCodeValue = response.rawStatusCode(); // 獲取響應狀態碼 ClientResponse.Headers headers = response.headers(); // 獲取響應頭 // 獲取響應體 Mono<PostDTO> resultMono = response.bodyToMono(PostDTO.class); PostDTO postDTO = resultMono.block(); // 輸出結果 System.out.println("響應狀態:" + httpStatus); System.out.println("響應狀態碼值:" + statusCodeValue); System.out.println("HTTP Headers:" + headers.asHttpHeaders()); System.out.println("響應體:" + postDTO); } ``` ## 五、POST方法 POST相對GET,比較繁瑣一些; ### **發送JSON字符串數據** ``` String jsonStr = "{\"1\": 1,\"title\": \"a\",\"body\": \"test\"}"; Mono<String> mono = webClient.post().uri("/posts").contentType(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(jsonStr)).retrieve().bodyToMono(String.class); ``` ### **發送JSON對象數據** ``` PostDTO postDTO = new PostDTO(); postDTO.setUserId(1); postDTO.setTitle("a"); postDTO.setBody("test"); Mono<PostDTO> mono = webClient.post().uri("/posts").contentType(MediaType.APPLICATION_JSON).bodyValue(postDTO).retrieve().bodyToMono(PostDTO.class); ``` ### **發送表單數據** ``` MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); map.add("para1", "paraVal1); map.add("para2", "paraVal2); Mono<String> mono = webClient.post().uri("/posts") .contentType(MediaType.APPLICATION_FORM_URLENCODED) .body(BodyInserters.fromFormData(map)).retrieve().bodyToMono(String.class); ``` ## 六、異常處理 ``` Mono<String> mono = getWebClient().get().uri("/postss/1").retrieve().onStatus(e -> e.is4xxClientError(), resp -> { System.out.println("發生客戶端輸入錯誤:" + resp.statusCode().value() + " "+ resp.statusCode().getReasonPhrase()); return Mono.error(new RuntimeException("請求失敗")); }) .onStatus(e -> e.is5xxServerError(), resp -> { System.out.println("發生服務端錯誤:" + resp.statusCode().value() + " " + resp.statusCode().getReasonPhrase()); return Mono.error(new RuntimeException("服務器異常")); }) .bodyToMono(String.class); ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看