如何使用JDK 11 java.net.http.HttpClient上传文件?

时间:2019-11-03 07:00:18

标签: java httpclient

我最近在JDK 11附带的java.net.http.HttpClient中遇到了一些问题,我不知道如何使用文件上传。在java.net.http.BodyPublishers中找到了ofInputStream()。我不知道我是否使用此方法上传文件。 这是我写的例子。

    public HttpResponse<String> post(String url, Supplier<? extends InputStream> streamSupplier, String... headers) throws IOException, InterruptedException {
        HttpRequest.Builder builder = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .headers(headers)
                .POST(null == streamSupplier ?
                        HttpRequest.BodyPublishers.noBody() : HttpRequest.BodyPublishers.ofInputStream(streamSupplier));
        HttpRequest request = builder.build();
        log.debug("Execute HttpClient Method:『{}』, Url:『{}』", request.method(), request.uri().toString());
        return client.send(request, HttpResponse.BodyHandlers.ofString());
    }

2 个答案:

答案 0 :(得分:2)

HttpRequest类型提供了用于创建请求发布者以处理诸如文件之类的主体类型的工厂方法:

HttpRequest.BodyPublishers::ofFile(Path)

您可以更新您的方法:

public HttpResponse<String> post(String url, Path file, String... headers) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(url))
            .headers(headers)
            .POST(null == file ? HttpRequest.BodyPublishers.noBody() : 
                HttpRequest.BodyPublishers.ofFile(file))
            .build();

        log.debug("Execute HttpClient Method:『{}』, Url:『{}』", request.method(), 
            request.uri().toString());
        return client.send(request, HttpResponse.BodyHandlers.ofString());
}

答案 1 :(得分:1)

java.net.http.HttpClient处理通过BodyPublisher提供的字节作为原始主体数据,没有任何解释。因此,无论您使用HttpRequest.BodyPublishers::ofFile(Path)还是HttpRequest.BodyPublishers::ofByteArray(byte[])在语义上都是无关紧要的:更改只是获取将要传输的字节的方式。 如果是文件上传-您的服务器可能希望请求主体将以某些方式格式化。它还可能期望某些特定的标头与请求一起发送(例如Content-Type等)。 HttpClient不会为您神奇地做到这一点。这是您需要在调用方级别实现的。