对于 Spring Boot Web 客户端,记录不可解析响应的首选机制是什么?

问题描述 投票:0回答:1

这是我的设置。我的大部分代码都通过 webflux 使用 .bodyToMono 。但是,如果发生解析错误,Webclient 没有很好的方法来获取导致问题的原始正文。在此示例中,假设 2xx 响应,但是没有返回格式正确的 json,而是出现了其他内容,可能是 html 或纯文本等。我想记录此格式错误的响应的值,然后以某种方式将其返回给调用客户端。 我在 Webflux 中看到的执行此操作的唯一路径是始终将主体转换为链顶部附近的字符串,并尝试通过对象映射器手动反序列化。在我的不可解析场景中,依赖 webflux api 仅向我显示解析失败的标记,而不是整个响应。对于可观察性、可追溯性等而言,这似乎是一个致命的缺陷。 我还缺少实现这个目标的另一条途径吗?

spring-webflux project-reactor
1个回答
0
投票

您应该添加一些代码片段和 throwable 以查看到底发生了什么。

一般来说,我处理的方式就是你提到的:首先

.bodyToMono(String.class)
,然后创建JSON对象。如果抛出异常,您可以立即记录整个字符串主体,如下所示:

    private Mono<String> handleClientResponse(ClientResponse clientResponse) {
        Mono<String> responseBodyMono = clientResponse.bodyToMono(String.class);
        HttpStatusCode responseStatus = clientResponse.statusCode();
        if (responseStatus.isError()) {
            return responseBodyMono.flatMap(errorBody ->
                    Mono.error(...)
            );
        } else {
            return responseBodyMono
                    .flatMap(responseBody -> {
                        try {
                            JSONObject jsonObject = new JSONObject(responseBody);
                            return Mono.just(jsonObject.getString(JSON_ATTRIBUTE_KEY));
                        } catch (Exception ex) {
                            log.error("Invalid response body with message: [{}]", ex.getMessage(), ex);
                            log.error("Response body was: [{}]", responseBody);
                            return Mono.error(...);
                        }
                    });
        }
    }

你尝试过这样的事情吗?

注意:为了可观察性/可追溯性,您始终可以使用其他模式,例如指标、跟踪请求 ID 等。对于实时服务来说,仅记录日志是不够的

© www.soinside.com 2019 - 2024. All rights reserved.