在 `java.net.http.HttpRequest` 中显式设置 `Content-Length` header
Explicitly setting `Content-Length` header in `java.net.http.HttpRequest`
我想通过 HTTP 从 InputStream
上传一个文件,为此,我正在使用作为 JDK11
的一部分提供的新 HttpClient
。当我尝试在创建 post 请求时设置 Content-Length
时,我得到一个 IllegalArgumentException
说 restricted 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
个字节。
我想通过 HTTP 从 InputStream
上传一个文件,为此,我正在使用作为 JDK11
的一部分提供的新 HttpClient
。当我尝试在创建 post 请求时设置 Content-Length
时,我得到一个 IllegalArgumentException
说 restricted 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
个字节。