【问题标题】:Response body in reactive spring反应弹簧中的响应体
【发布时间】: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


【解决方案1】:

您将收到正确的结果,因为您的 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();

【讨论】:

    猜你喜欢
    • 2011-10-10
    • 1970-01-01
    • 2022-07-18
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多