Как загрузить файлы, используя JDK 11 java.net.http.HttpClient? - PullRequest
4 голосов
/ 03 ноября 2019

Недавно я столкнулся с некоторыми проблемами с java.net.http.HttpClient, который поставляется с JDK 11. Я не знаю, как использовать загрузку файлов. Нашел ofInputStream () в java.net.http.BodyPublishers. Я не знаю, использую ли я этот метод загрузки файла. Вот примеры, которые я написал.

    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 ]

2 голосов
/ 03 ноября 2019

Тип 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 голос
/ 05 ноября 2019

java.net.http.HttpClient обрабатывает байты, передаваемые через BodyPublisher, как необработанные данные тела, без какой-либо интерпретации. Таким образом, семантически не имеет значения, используете ли вы HttpRequest.BodyPublishers::ofFile(Path) или HttpRequest.BodyPublishers::ofByteArray(byte[]): что просто меняет способ получения байтов, которые будут переданы. В случае загрузки файла - ваш сервер, вероятно, ожидает, что тело запроса будет отформатировано определенным образом. Можно также ожидать, что некоторые конкретные заголовки будут переданы вместе с запросом (например, Content-Type и т. Д.). HttpClient не сделает это волшебным образом для вас. Это то, что вам нужно реализовать на уровне вызывающего абонента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...