Spring Web 客户端 - 如何获取失败请求的响应字符串包装介绍重试

Spring Web Client - How to get response string of failed request wrapped intro retrials

一点背景知识

我想调用服务的 API,同时重试 5xx 错误。另外,我想访问每个失败的请求(用于记录目的)。

代码

getClient()
     .get()
     .uri("http://example.com")
     .retrieve()
     .onStatus(HttpStatus::is5xxServerError, rsp -> Mono.error(new ApiServerException("Server error", rsp.rawStatusCode())))
     .bodyToMono(ReportListResponse.class)
     .retryWhen(
          Retry
               .backoff(3, Duration.ofSeconds(1))
               .filter(throwable -> throwable instanceof ApiServerException)
     )
     .block();

问题

如何实现能够访问每个失败请求的响应的目标?我在 onStatus 方法中使用 rsp.bodyToMono(String.class) 时试图检索主体。不幸的是,它没有给我预期的输出。

您需要在 onStatus 中使用 response.bodyToMono 来获取响应正文。以下示例显示了如何将正文反序列化为 String,但您也可以定义 POJO。

getClient()
        .get()
        .uri("http://example.com")
        .retrieve()
        .onStatus(HttpStatus::isError, response ->
                response.bodyToMono(String.class)
                        .doOnNext(responseBody ->
                                log.error("Error response from server: {}", responseBody)
                        )
                        // throw original error
                        .then(response.createException())
        )
        .bodyToMono(ReportListResponse.class)
    }