尝试根据返回的状态码抛出异常时如何检索响应主体?例如,假设我想抛出异常并拒绝 HTTP 201。
client.post().exchange().doOnSuccess(response -> {
if (response.statusCode().value() == 201) {
throw new RuntimeException();
}
}
我如何用响应的主体填充异常,以便我可以抛出详细的 WebClientResponseException
?
我应该使用不同的方法来测试响应状态代码吗?
编辑: 我试图在使用 exchange()
时复制以下功能。
client.get()
.retrieve()
.onStatus(s -> !HttpStatus.CREATED.equals(s),
MyClass::createResponseException);
//MyClass
public static Mono<WebClientResponseException> createResponseException(ClientResponse response) {
return response.body(BodyExtractors.toDataBuffers())
.reduce(DataBuffer::write)
.map(dataBuffer -> {
byte[] bytes = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(bytes);
DataBufferUtils.release(dataBuffer);
return bytes;
})
.defaultIfEmpty(new byte[0])
.map(bodyBytes -> {
String msg = String.format("ClientResponse has erroneous status code: %d %s", response.statusCode().value(),
response.statusCode().getReasonPhrase());
Charset charset = response.headers().contentType()
.map(MimeType::getCharset)
.orElse(StandardCharsets.ISO_8859_1);
return new WebClientResponseException(msg,
response.statusCode().value(),
response.statusCode().getReasonPhrase(),
response.headers().asHttpHeaders(),
bodyBytes,
charset
);
});
}
原文由 CoryO 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以通过自定义 ExchangeFilterFunction 然后在构建 WebClient 之前将其与 WebClient.Builder 连接起来来实现这一点。
您可以像这样使用上面的内容:
因此,任何 4XX 或 5XX HttpResponse 实际上都会抛出 CustomWebClientResponseException 并且您可以配置一些全局异常处理程序并使用它执行您喜欢的操作。至少使用 ExchangeFilterFunction 你可以在全球范围内处理这样的事情或者添加自定义标头和东西。