如何防止Spring Web客户端将"Content-Length"标头更改为小写"内容长度"?



我正在向第三方API发送请求,而他们的服务器(PHP 5.5(要求content-length头的大小写为'content-length'。

然而,我使用的是Spring Web客户端,它以小写的"Content-Length"发送"Content-Length",但我试图以大写的形式发送。

webClient
.method(method)
.uri(uri)
.headers(headersConsumer)
.header("Content-Length-Test", Integer.toString(objectMapper.writeValueAsBytes(reqBody).length))
.header("Content-Length", Integer.toString(objectMapper.writeValueAsBytes(reqBody).length))
.bodyValue(Optional.ofNullable(reqBody).orElse(""))
.retrieve()
.bodyToMono(returnType)

结果

POST /test/test HTTP/1.1
user-agent: ReactorNetty/1.0.12
Content-Type: application/json
Authorization: Basic 
Accept: */*
Host: 127.0.0.1:9999
Content-Length-Test: 202
content-length: 202

你可以看到";内容长度测试";我按预期打印出来,但不是为了实际的";"内容长度";头球

我已经阅读了以下和相关的文章,介绍了HTTP标准如何指定所有标头都不区分大小写。

问题是我的服务所需的API在处理头时是区分大小写的。如何防止将头名称转换为小写-Spring引导?

如何防止Content-Length标头小写?

需要帮助。

谢谢。

WebClient默认在下面使用Reactor Netty,并插入Content-Length标头本身;您不需要在WebClient级别提供它。可以看出,这确实是小写的。

要解决此问题,您应该自己配置一个Netty HttpClient,然后将其传递给WebClient(通过ReactorClientHttpConnector(。

HttpClient设置应该包括(注意,它使用了一个流畅的接口,因此您需要使用从doOnConnected返回的HttpClient(:

httpClient.doOnConnected(connection -> connection.addHandlerFirst(new MessageToMessageEncoder<HttpRequest>() {
@Override
protected void encode(ChannelHandlerContext ctx, HttpRequest msg, List<Object> out) {
HttpHeaders requestHeaders = msg.headers();
String value = requestHeaders.get("content-length");
if (value != null) {
requestHeaders.remove("content-length")
.set("Content-Length", value);
} 
if (msg instanceof ReferenceCounted)
((ReferenceCounted)msg).retain();
out.add(msg);
}
))

相关内容

  • 没有找到相关文章

最新更新