首页 > 解决方案 > 在 `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 以允许受限标头。

我也可以使用另一个库,只是想知道在切换到RestTemplateSpring 之前是否可以选择使用 JDK 中的类。(是的,它已被弃用,因为替代品使用弹簧靴目前不能使用它)

标签: httpclientjava-11java-http-client

解决方案


只需使用fromPublisher

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

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


推荐阅读