响应解码

WebClient 提供了两种对响应的处理方法:

  • retrieveretrieve 方法是直接获取响应 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();

默认情况下,4xx5xx 的状态码会抛出 WebClientResponseException 或它的 HTTP 状态的具体子类之一,比如 WebClientResponseException.BadRequestWebClientResponseException.NotFound 和其他异常。你也可以使用 onStatus 方法来自定义所产生的异常。

exchangeToMono/exchangeToFlux

retrieve 不同,exchangeToMono/exchangeToFlux 没有 4xx5xx 的自动错误信号,你必须检查状态码并决定如何处理。

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 流弹出。

最后更新于

这有帮助吗?