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)
}
一点背景知识
我想调用服务的 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)
}