响应解码
WebClient 提供了两种对响应的处理方法:
retrieve
:retrieve
方法是直接获取响应 body。exchange
:可以获取到响应头、Cookie 等信息,exchange
方法可以访问整个 ClientResponse。
retrieve
WebClient webClient = WebClient.create("https://jsonplaceholder.typicode.com")
.get()
.uri("/todos/1")
.retrieve()
.onStatus(HttpStatusCode::is4xxClientError, clientResponse -> Mono.error(new RuntimeException("请求失败")))
.onStatus(HttpStatusCode::is5xxServerError, clientResponse -> Mono.error(new RuntimeException("请求失败")))
.bodyToMono(Todo.class)
.block();
默认情况下,4xx
活 5xx
的状态码会抛出 WebClientResponseException
或它的 HTTP 状态的具体子类之一,比如 WebClientResponseException.BadRequest
,WebClientResponseException.NotFound
和其他异常。你也可以使用 onStatus
方法来自定义所产生的异常。
exchangeToMono/exchangeToFlux
与 retrieve
不同,exchangeToMono/exchangeToFlux
没有 4xx
和 5xx
的自动错误信号,你必须检查状态码并决定如何处理。
WebClient webClient = WebClient.create("https://jsonplaceholder.typicode.com/posts")
.get()
.uri("/1")
.exchangeToMono(response -> {
System.out.println(response.statusCode());
System.out.println(response.cookies().getFirst("XSRF-TOKEN"));
System.out.println(response.headers().asHttpHeaders());
return response.bodyToMono(String.class);
})
.block();
response body 转换响应流
bodyToMono
:如果返回结果是一个 Object,WebClient
将接收到响应后把 JSON 字符串转换为对应的对象,并通过 Mono 流弹出。bodyToFlux
:如果响应的结果是一个集合,则不能继续使用bodyToMono()
,应该改用bodyToFlux()
,然后依次处理每一个元素,并通过Flux
流弹出。
最后更新于
这有帮助吗?