Spring之WebClient介绍
WebClient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具。它的响应式编程的基于Reactor的。WebClient中提供了标准Http请求方式对应的get、post、put、delete等方法,可以用来发起相应的请求。下面的代码是一个简单的WebClient请求示例。可以通过WebClient.create()
创建一个WebClient的实例,之后可以通过get()
、post()
等选择调用方式,uri()
指定需要请求的路径,retrieve()
用来发起请求并获得响应,bodyToMono(String.class)
用来指定请求结果需要处理为String,并包装为Reactor的Mono对象。
WebClient webClient = WebClient.create();
Mono<String> mono = webClient.get().uri("https://www.baidu.com").retrieve().bodyToMono(String.class);
mono.subscribe(System.out::println);
响应结果解析为对象
当响应的结果是JSON时,也可以直接指定为一个Object,WebClient将接收到响应后把JSON字符串转换为对应的对象。比如下面这样。
WebClient webClient = WebClient.create();
Mono<User> mono = webClient.get().uri("http://localhost:8081/user/1").retrieve().bodyToMono(User.class);
User user = mono.block();
如果响应的结果是一个集合,则不能继续使用bodyToMono()
,应该改用bodyToFlux()
,然后依次处理每一个元素,比如下面这样。
String baseUrl = "http://localhost:8081";
WebClient webClient = WebClient.create(baseUrl);
Flux<User> userFlux = webClient.get().uri("users").retrieve().bodyToFlux(User.class);
userFlux.subscribe(System.out::println);
如果需要通过Flux取到所有的元素构造为一个List,则可以通过如下的方式获取。
List<User> users = userFlux.collectList().block();
URL中使用路径变量
URL中也可以使用路径变量,路径变量的值可以通过uri方法的第2个参数指定。下面的代码中就定义了URL中拥有一个路径变量id,然后实际访问时该变量将取值1。
webClient.get().uri("http://localhost:8081/user/{id}", 1);
URL中也可以使用多个路径变量,多个路径变量的赋值将依次使用uri方法的第2个、第3个、第N个参数。下面的代码中就定义了URL中拥有路径变量p1和p2,实际访问的时候将被替换为var1和var2。所以实际访问的URL是http://localhost:8081/user/var1/var2
。
webClient.get().uri("http://localhost:8081/user/{p1}/{p2}", "var1", "var2");
使用的路径变量也可以通过Map进行赋值。面的代码中就定义了URL中拥有路径变量p1和p2,实际访问的时候会从uriVariables中获取值进行替换。所以实际访问的URL是http://localhost:8081/user/var1/1
Map<String, Object> uriVariables = new