我正在向第三方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);
}
))