【问题标题】:Add a header to an outgoing request by a filter in WebFlux通过 WebFlux 中的过滤器向传出请求添加标头
【发布时间】:2019-05-14 04:35:55
【问题描述】:

我正在为客户端和服务器使用 Java Spring WebFlux,我想通过向其添加自定义标头来自定义从客户端到服务器的请求。我已经将 WebFilter 用于另一个目的,但它似乎只适用于传入的请求和响应(例如来自 FE 的请求和对它的响应)。

【问题讨论】:

    标签: java spring spring-webflux


    【解决方案1】:

    有多种方法可以指定自定义标题。

    如果标头是静态的,您可以在 WebClient 实例创建期间使用 defaultHeaderdefaultHeaders 方法指定它们:

    WebClient.builder().defaultHeader("headerName", "headerValue")
    WebClient.builder().defaultHeaders(headers -> headers.add("h1", "hv1").add("h2", "hv2"))
    

    如果标头是动态的,但标头值生成对于所有请求都是通用的,则可以使用在 WebClient 实例创建期间配置的 ExchangeFilterFunction.ofRequestProcessor

    WebClient
        .builder()
        .filter(ExchangeFilterFunction.ofRequestProcessor(
            request -> Mono.just(ClientRequest.from(request)
                                              .header("X-HEADER-NAME", "value")
                                              .build())
        )
        .build();
    

    如果每次使用 WebClient 时标头都是动态且特定的,则您可以配置每次调用的标头:

    webClient.get()
        .header("headerName", getHeaderValue(params))
        .retrieve();
    

    【讨论】:

    • request -> request.headers().add("headerName", getHeaderValuePer(request))) 给了我一个UnsupportedOperationException,因为返回的标头列表的类型为ReadOnlyHttpHeaders,它在名称中描述了问题。
    • 我更新了答案。 ClientRequest 是不可变的,因此您必须构建它的新实例来修改标头。
    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 2018-06-22
    • 1970-01-01
    • 2023-04-04
    • 2021-06-09
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    相关资源
    最近更新 更多