繁体   English   中英

反应式响应体 spring

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM