【发布时间】:2021-09-30 16:07:09
【问题描述】:
我在获取带有反应弹簧的响应体时遇到问题。我正在与之集成的服务可以具有不同的 JSON 主体作为响应,因此我无法拥有可以将响应映射到的 DTO,因此我尝试使用 String。 为了检查现在的解决方案,我使用 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]")
我试图在该单声道上使用 subscribe、map 和 flatMap,但唯一的结果是我在该错误消息上得到了不同的类类型,但与我正在寻找的没有什么相似之处。 我将不胜感激以任何形式获取响应正文的任何帮助,我可以使用它的内容。
编辑答案: 发布后一分钟,我找到了解决方案: 所以我尝试在单声道上订阅:
.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 在订阅之前不会给出结果。
【问题讨论】:
-
你能添加执行调用的完整代码吗? JSON 是嵌套的还是只有一个深度级别?
-
可以嵌套,可以单层。
-
尽管如此,400 提示是请求本身存在问题,而不是处理响应。这就是我要求完整代码的原因。
-
400 是我故意从 SoapUi 返回的代码,只是为了输入 if。
-
响应订阅了吗?
标签: java spring spring-webflux