在 Spring Boot 中使用 Web Client Mono 获取 API 响应错误消息

新手上路,请多包涵

我正在使用 webflux Mono(在 Spring Boot 5 中)来使用外部 API。当 API 响应状态码为 200 时,我能够很好地获取数据,但是当 API 返回错误时,我无法从 API 中检索错误消息。 Spring webclient 错误处理程序始终将消息显示为

ClientResponse has erroneous status code: 500 Internal Server Error ,但是当我使用 PostMan 时,API 返回此 JSON 响应,状态码为 500。

 {
 "error": {
    "statusCode": 500,
    "name": "Error",
    "message":"Failed to add object with ID:900 as the object exists",
    "stack":"some long message"
   }
}

我使用 WebClient 的请求如下

webClient.getWebClient()
            .post()
            .uri("/api/Card")
            .body(BodyInserters.fromObject(cardObject))
            .retrieve()
            .bodyToMono(String.class)
            .doOnSuccess( args -> {
                System.out.println(args.toString());
            })
            .doOnError( e ->{
                e.printStackTrace();
                System.out.println("Some Error Happend :"+e);
            });

我的问题是,当 API 返回状态码为 500 的错误时,如何访问 JSON 响应?

原文由 Mohale 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

看看 .onErrorMap() ,这给了你一个例外。由于您可能还需要exchange() 的body() 来查看,所以不要使用retrieve,而是

.exchange().flatMap((ClientResponse) response -> ....);

原文由 Frischling 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果要检索错误详细信息:

 WebClient webClient = WebClient.builder()
    .filter(ExchangeFilterFunction.ofResponseProcessor(clientResponse -> {
        if (clientResponse.statusCode().isError()) {
            return clientResponse.bodyToMono(ErrorDetails.class)
                    .flatMap(errorDetails -> Mono.error(new CustomClientException(clientResponse.statusCode(), errorDetails)));
        }
        return Mono.just(clientResponse);
    }))
    .build();

class CustomClientException extends WebClientException {
    private final HttpStatus status;
    private final ErrorDetails details;

    CustomClientException(HttpStatus status, ErrorDetails details) {
        super(status.getReasonPhrase());
        this.status = status;
        this.details = details;
    }

    public HttpStatus getStatus() {
        return status;
    }

    public ErrorDetails getDetails() {
        return details;
    }
}

并使用 ErrorDetails 类映射错误正文

每个请求变体:

 webClient.get()
    .exchange()
    .map(clientResponse -> {
        if (clientResponse.statusCode().isError()) {
            return clientResponse.bodyToMono(ErrorDetails.class)
                    .flatMap(errorDetails -> Mono.error(new CustomClientException(clientResponse.statusCode(), errorDetails)));
        }
        return clientResponse;
    })

原文由 darrachequesne 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏