httpclient - 在 `java.net.http.HttpRequest` 中显式设置 `Content-Length` 标头
问题描述
我想InputStream
通过 HTTP 上传一个文件,为此,我使用了HttpClient
作为JDK11
. 当我尝试Content-Length
在创建发布请求时设置时,我得到一个IllegalArgumentException
说法restricted header name: "Content-Length"
,如果我尝试从InputStream
没有Content-Length
标题的情况下上传文件,我会internal server error
从我想要上传文件的服务器获得一个。是否有任何选项可以Content-Length
在 Java 11 中的请求中设置?我用于创建的代码HttpRequest
:
var postRequest = HttpRequest.newBuilder()
.POST(HttpRequest.BodyPublishers.ofInputStream(() -> inputStream))
.uri(new URI(url))
.header(HttpHeaders.CONTENT_LENGTH, Long.toString(inputStreamSupplier.getFileSize()))
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE)
.build();
注意:无法更新到 Java 12 以允许受限标头。
我也可以使用另一个库,只是想知道在切换到RestTemplate
Spring 之前是否可以选择使用 JDK 中的类。(是的,它已被弃用,因为替代品使用弹簧靴目前不能使用它)
解决方案
只需使用fromPublisher:
var bodyPublisher = BodyPublishers
.fromPublisher(BodyPublishers.ofInputStream(()-> inputStream)), length);
请注意,您必须确保 InputStream 准确传递length
字节。