使用WebClient進行Http遠程調用
文章目錄
- 使用WebClient進行Http遠程調用
- 1.WebClient對象創建
- 2.WebClient對象抽取config配置
- 3.Get請求url參數設置
- 4.獲取ResponseEntity對象
- 5.Post請求
- 測試示例代碼
- WebClient 一旦創建,就是不可修改的,如果需要設置默認值,可以借助 mutate 繼承當前webclient的屬性,再進行擴展
- subscribe方式獲取的是webFlux接口返回的數據 ans.subscribe(s -> System.out.println("create return: " + s));
- 傳統接口使用block阻塞獲取內容
- GET請求 webClient.get().uri(xxx).retrieve().bodyToMono/bodyToFlux,分別獲取Mono和Flux數據
- bodyToMono用于獲取0個或1個元素,而bodyToFlux對象獲取1個或多個元素
引入webFlux依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>
1.WebClient對象創建
/*** WebClient 創建,* 1.create創建WebClient實例* 2.build創建WebClient實例(可以設置請求頭等參數)* 3.mutate 方式 在一個已經存在的WebClient基礎上,再創建一個滿足自定義需求的WebClient* 發起get請求,并將返回的數據格式轉換為String;因為是異步請求,所以返回的是Mono包裝的對象*/WebClient webClient= WebClient.create();Mono<String> ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx").retrieve().bodyToMono(String.class);System.out.println("create return: " + ans.block());webClient= WebClient.create();Flux<String> an1 = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/xxx").retrieve().bodyToFlux(String.class);an1.toStream().forEach(System.out::println);webClient = WebClient.builder().defaultHeader("User-Agent", "WebClient Agent").build();ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx").retrieve().bodyToMono(String.class);System.out.println("builder return: " + ans.block());webClient = webClient.mutate().defaultCookie("cookie", "aaa").build();ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx").retrieve().bodyToMono(String.class);System.out.println("mutate return: " + ans.block());
2.WebClient對象抽取config配置
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;@Configuration
public class WebClientConfig {@Beanpublic WebClient webClient() {return WebClient.builder()//默認基礎地址,配置后后續請求可以不加.baseUrl("http://127.0.0.1:12000").defaultHeader("Content-Type", "application/json").defaultHeader("Accept", "application/json").build();}
}
@Autowiredprivate WebClient webClient;
3.Get請求url參數設置
//url參數ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/wechat/xxx/info?year={a}",1).retrieve().bodyToMono(String.class);System.out.println("create return: " + ans.block());//map映射url參數Map<String, Object> uriVariables = new HashMap<>();uriVariables.put("a", 1);uriVariables.put("b", "測試");ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx?action=arrival&isYear={a}&keyword={b}",uriVariables).retrieve().bodyToMono(String.class);System.out.println("create return: " + ans.block());
4.獲取ResponseEntity對象
//獲取 ResponseEntityMono<ResponseEntity<String>> response = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx").exchange().flatMap(r -> r.toEntity(String.class));ResponseEntity<String> entity = Objects.requireNonNull(response.block());System.out.println(" headers: " + entity.getHeaders() + " body: " + entity.getBody());
5.Post請求
//表單參數webClient = WebClient.create("http://127.0.0.1:12000");MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();formData.add("name", "張三");formData.add("age", "18");ans = webClient.post().uri("/post").bodyValue(formData).retrieve().bodyToMono(String.class);System.out.println("post formData ans " + ans.block());// json參數UserObj userObj = new UserObj("張三",18);ans = webClient.post().uri("/body").contentType(MediaType.APPLICATION_JSON).bodyValue(userObj).retrieve().bodyToMono(String.class);System.out.println("post formData ans " + ans.block());
測試示例代碼
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;import java.util.HashMap;
import java.util.Map;
import java.util.Objects;/*** WebClient 一旦創建,就是不可修改的,如果需要設置默認值,可以借助 mutate 繼承當前webclient的屬性,再進行擴展* subscribe方式獲取的是webFlux接口返回的數據 ans.subscribe(s -> System.out.println("create return: " + s));* 傳統接口使用block阻塞獲取內容* GET請求 webClient.get().uri(xxx).retrieve().bodyToMono/bodyToFlux,分別獲取Mono和Flux數據*/
public class WebClientTest {public static void main(String[] args) {/*** WebClient 創建,* 1.create創建WebClient實例* 2.build創建WebClient實例(可以設置請求頭等參數)* 3.mutate 方式 在一個已經存在的WebClient基礎上,再創建一個滿足自定義需求的WebClient* 發起get請求,并將返回的數據格式轉換為String;因為是異步請求,所以返回的是Mono包裝的對象*/WebClient webClient= WebClient.create();Mono<String> ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx").retrieve().bodyToMono(String.class);System.out.println("create return: " + ans.block());webClient= WebClient.create();Flux<String> an1 = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/xxx").retrieve().bodyToFlux(String.class);an1.toStream().forEach(System.out::println);webClient = WebClient.builder().defaultHeader("User-Agent", "WebClient Agent").build();ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx").retrieve().bodyToMono(String.class);System.out.println("builderCreate with header return: " + ans.block());webClient = webClient.mutate().defaultCookie("ck", "--web--client--ck--").build();ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx").retrieve().bodyToMono(String.class);System.out.println("webClient#mutate with cookie return: " + ans.block());/*** url參數設置* 1.url可變參數* 2.map映射url參數*///url可變參數ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/wechat/xxx/info?year={a}",1).retrieve().bodyToMono(String.class);System.out.println("create return: " + ans.block());//map映射url參數Map<String, Object> uriVariables = new HashMap<>();uriVariables.put("a", 1);uriVariables.put("b", "測試");ans = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx?action=arrival&isYear={a}&keyword={b}",uriVariables).retrieve().bodyToMono(String.class);System.out.println("create return: " + ans.block());//獲取 ResponseEntityMono<ResponseEntity<String>> response = webClient.get().uri("http://127.0.0.1:12000/api/v1/service/wechat/xxx").exchange().flatMap(r -> r.toEntity(String.class));ResponseEntity<String> entity = Objects.requireNonNull(response.block());System.out.println("res headers: " + entity.getHeaders() + " body: " + entity.getBody());/*** post請求* 1.表單* 2.json數據*///表單參數webClient = WebClient.create("http://127.0.0.1:12000");MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();formData.add("name", "張三");formData.add("age", "18");//默認的ContentType就是"application/x-www-form-urlencoded",所以下面這個contentType是可以不顯示設置的ans = webClient.post().uri("/post")// .contentType(MediaType.APPLICATION_FORM_URLENCODED).bodyValue(formData).retrieve().bodyToMono(String.class);System.out.println("post formData ans " + ans.block());// json參數UserObj userObj = new UserObj("張三",18);ans = webClient.post().uri("/body").contentType(MediaType.APPLICATION_JSON).bodyValue(userObj).retrieve().bodyToMono(String.class);System.out.println("post formData ans " + ans.block());}}
參考原文:https://blog.csdn.net/cxyxysam/article/details/135425646