在 `java.net.http.HttpRequest` 中显式设置 `Content-Length` header

Explicitly setting `Content-Length` header in `java.net.http.HttpRequest`

我想通过 HTTP 从 InputStream 上传一个文件,为此,我正在使用作为 JDK11 的一部分提供的新 HttpClient。当我尝试在创建 post 请求时设置 Content-Length 时,我得到一个 IllegalArgumentExceptionrestricted header name: "Content-Length" 并且如果我尝试从 InputStream 上传一个文件而没有Content-Length header 我从我要上传文件的服务器得到一个 internal server error。在 Java 11 的请求中是否有设置 Content-Length 的选项? 我用于创建 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 以允许受限的 headers。

我也可以使用另一个库,只是想知道在从 Spring 切换到 RestTemplate 之前是否有使用 JDK 的 类 的选项。 (是的,它已被弃用,因为替代使用 spring 引导目前无法使用它)

只需使用fromPublisher:

var bodyPublisher = BodyPublishers
    .fromPublisher(BodyPublishers.ofInputStream(()-> inputStream)), length);

请注意,您必须确保 InputStream 准确传送 length 个字节。