RestTemplate转WebClient:PUT请求空Body的写法规范咨询
WebClient PUT请求:无请求体 vs .bodyValue(null)的合法性说明
两种写法都是合法的,但HTTP行为和WebClient的处理逻辑有细微区别,要不要显式声明空请求体取决于你需要匹配的原有行为:
1. 未指定请求体的写法
示例代码:
webClient.put() .uri("/api/your-resource") .headers(headers -> headers.addAll(yourRequestHeaders)) .retrieve() .bodyToMono(Void.class);
这种情况下,WebClient发送的PUT请求不带任何请求体,也不会添加Content-Length这类和请求体相关的头部。HTTP请求结构大致如下:
PUT /api/your-resource HTTP/1.1
Host: your-server.com
[你的自定义请求头]
HTTP规范里并没有强制要求PUT请求必须携带请求体,只要你的服务器支持接收无请求体的PUT,这种写法完全可行。
2. 使用.bodyValue(null)的写法
示例代码:
webClient.put() .uri("/api/your-resource") .headers(headers -> headers.addAll(yourRequestHeaders)) .bodyValue(null) .retrieve() .bodyToMono(Void.class);
这种写法会让WebClient显式发送一个空请求体,同时自动添加Content-Length: 0请求头,和你之前用RestTemplatenew HttpEntity<>(null, headers)的行为完全一致。对应的HTTP请求结构:
PUT /api/your-resource HTTP/1.1
Host: your-server.com
Content-Length: 0
[你的自定义请求头]
要不要显式声明空请求体?
- 如果你需要和原有RestTemplate的行为100%对齐,确保服务器收到带
Content-Length: 0的请求,就用.bodyValue(null); - 如果服务器兼容无请求体的PUT请求,两种写法都能正常工作,选哪种都可以。
内容的提问来源于stack exchange,提问作者joseluisbz
相关产品推荐
相关产品推荐

