【发布时间】:2019-05-14 04:35:55
【问题描述】:
我正在为客户端和服务器使用 Java Spring WebFlux,我想通过向其添加自定义标头来自定义从客户端到服务器的请求。我已经将 WebFilter 用于另一个目的,但它似乎只适用于传入的请求和响应(例如来自 FE 的请求和对它的响应)。
【问题讨论】:
标签: java spring spring-webflux
我正在为客户端和服务器使用 Java Spring WebFlux,我想通过向其添加自定义标头来自定义从客户端到服务器的请求。我已经将 WebFilter 用于另一个目的,但它似乎只适用于传入的请求和响应(例如来自 FE 的请求和对它的响应)。
【问题讨论】:
标签: java spring spring-webflux
有多种方法可以指定自定义标题。
如果标头是静态的,您可以在 WebClient 实例创建期间使用 defaultHeader 或 defaultHeaders 方法指定它们:
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 是不可变的,因此您必须构建它的新实例来修改标头。