【问题标题】:Explicitly setting `Content-Length` header in `java.net.http.HttpRequest`在 `java.net.http.HttpRequest` 中显式设置 `Content-Length` 标头
【发布时间】:2021-11-15 10:38:42
【问题描述】:

我想通过 HTTP 从InputStream 上传一个文件,为此,我使用作为JDK11 一部分提供的新HttpClient。当我尝试在创建发布请求时设置Content-Length 时,我得到一个IllegalArgumentExceptionrestricted header name: "Content-Length",如果我尝试从InputStream 上传一个没有Content-Length 标头的文件,我会从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 以允许使用受限标头。

我也可以使用另一个库,只是想知道在从 Spring 切换到 RestTemplate 之前是否可以选择使用 JDK 中的类。 (是的,它已被弃用,作为替代品使用 spring boot 暂时不能使用)

【问题讨论】:

    标签: httpclient java-11 java-http-client


    【解决方案1】:

    只需使用fromPublisher:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 2015-10-22
      相关资源
      最近更新 更多