【问题标题】:Java Spring: How to access the originating request from ClientResponse?Java Spring:如何从 ClientResponse 访问原始请求?
【发布时间】:2023-01-26 01:28:32
【问题描述】:

背景

ClientResponse 类很可能在内部可以访问原始请求,正如 createError() 等方法的文档所暗示的那样:

创建一个以 WebClientResponseException 结尾的 Mono,包含响应状态、标题、正文和原始请求.

问题

有没有办法访问来自 ClientResponse 的原始请求?

背后的动机

我正在使用我想访问的ExchangeFilterFunction.ofResponseProcessor()编写自己的ExchangeFilterFunction原始请求:

@Bean
public ExchangeFilterFunction logResponse() {
    return ExchangeFilterFunction.ofResponseProcessor(response -> {
        return Mono.just(response)
            .doOnEach(resp -> log.info("""
                        {} {}
                        {}
                        Response Headers: {}""",
                ORIG_METHOD, ORIG_URI, // Here I need the originating request
                response.statusCode(),
                response.headers().asHttpHeaders())
            );
    });
}

【问题讨论】:

    标签: java spring spring-boot web-services spring-webflux


    【解决方案1】:

    不确定您是否可以从 ClientResponse 访问 ClientRequest,
    但您可以使用 ExchangeFilterFunction 访问它们

    ExchangeFilterFunction 是一个@FunctionalInterface 这意味着我们可以使用简单的 lambda 来完成这项任务

    @Bean
    public ExchangeFilterFunction logResponse() {
        return (request, next) -> {
        // here you have access to request object
            return next.exchange(request)
                       .doOnEach(response -> {/*here you have access to request AND response objects*/});
        };
    }
    

    您还使用 Mono.doOnEach 将 Consumer<Signal<ClientResponse>> 作为参数
    我建议切换到 Mono.doOnNext 以访问 ClientResponse 而不是 Signal<ClientResponse>

    所以你的例子(没有括号)看起来像这样:

    @Bean
    public ExchangeFilterFunction logResponse() {
        return (request, next) -> 
            next.exchange(request)
                .doOnNext(response -> 
                    log.info("""
                        {} {}
                        {}
                        Response Headers: {}""",
                    request.method(), 
                    request.url,
                    response.statusCode(),
                    response.headers().asHttpHeaders()));
    

    【讨论】:

    • 我试过了,但没有设法重写它,所以我的响应与您的代码的响应相匹配。您能否尝试将我的代码重写为您的版本?
    猜你喜欢
    • 2015-10-19
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 2010-09-15
    • 2018-11-27
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多