[英]Response body in reactive spring
我在获取具有反应性 spring 的响应主体时遇到问题。我正在集成的服务可以有不同的 JSON 主体作为响应,因此我无法拥有可以 map 响应的 DTO,所以我正在尝试细绳。 现在为了检查解决方案,我用 SoapUi 模拟了一个简单的服务器以返回代码 400 和 JSON:
{
"errorCode" : "code",
"errorMessage" : "message"
}
我希望能够在出现错误的情况下登录控制台,所以这是我的部分代码:
.bodyValue(eventDataDto)
.exchange()
.doOnSuccess((response) -> {
if (response.rawStatusCode() != HttpStatus.OK.value()) {
throw new RuntimeException("Sending request failed with status: " + response.rawStatusCode() +
" with error message: " + response.bodyToMono(String.class);
}
})
.doOnError((throwable) -> {
throw new RuntimeException(throwable);
})
.block();
但我得到的回应是:
Sending request failed with status: 400 with error message: checkpoint("Body from POST http://localhost:8095/test/ [DefaultClientResponse]")
我试图在该 mono 上使用订阅、map 和 flatMap,但唯一的结果是我在该错误消息上得到了不同的 class 类型,但与我正在寻找的完全不同。 对于以任何形式获取响应正文的任何帮助,我将不胜感激,因为我可以使用其内容。
编辑答案:发布后一分钟我找到了解决方案:所以我尝试订阅 mono:
.bodyValue(eventDataDto)
.exchange()
.doOnSuccess((response) -> {
if (response.rawStatusCode() != HttpStatus.OK.value()) {
Mono<String> bodyMono = response.bodyToMono(String.class);
bodyMono.subscribe(body -> {
throw new RuntimeException(
"Sending request failed with status: " + response.rawStatusCode() +
" with error message: " + body);
});
}
})
.doOnError((throwable) -> {
throw new RuntimeException(throwable);
})
.block();
我完全忘记了 Mono 在订阅之前不会给出结果。
您收到正确的结果,因为您的HTTP
调用成功(通过)但返回 400 ~ Bad Request响应代码,这是一个完整简洁的 HTTP 响应(这是您根据 OP 中的描述配置的正确响应)。
为了检索响应主体,无论是成功 (200) 响应还是不成功 (400) 响应的正确响应主体,您应该使用:
toEntity
运算符bodyToMono
一个在这里,您的调用链看起来如何使用bodyToMono
映射错误响应内容:
webClient.get()
.uri("some-uri")
.bodyValue(eventDataDto)
.exchange()
.flatMap((response) -> {
if (response.rawStatusCode() != HttpStatus.OK.value()) {
return response.bodyToMono(String.class)
.map(errorContent -> "Sending request failed with status: " + response.rawStatusCode() + " with error message: " + errorContent);
} else {
return response.bodyToMono(String.class);
})
.block();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.