Apache Http-клиент выполняет запрос без отправки включающего объекта - PullRequest
2 голосов
/ 03 апреля 2020

У меня есть следующий сценарий:

1) Клиент отправляет HTTP-запрос с включающим объектом на сервер через сокет.

2) Сервер загружает включающий объект в другое место, назовем его Storage.

Мне нужно реализовать только Сервер.

До сих пор я смог реализовать его с использованием Apache HTTP Components библиотека, использующая что-то вроде:

// The request from the client
org.apache.http.HttpRequest request = ...;

// The org.apache.http.entity.InputStreamEntity will 
// read bytes from the socket and write to the Storage
HttpEntity entity = new InputStreamEntity(...)

BasicHttpEntityEnclosingRequest requestToStorage = new ......
requestToStorage.setEntity(entity);

CloseableHttpClient httpClient = ...

CloseableHttpResponse response = httpClient.execute(target, requestToStorage );

Пока все хорошо. Проблема в том, что сервер хранения требует аутентификации. Когда Сервер делает первый запрос (через Apache Http Client API), Хранилище отвечает 407 Требуется аутентификация. Apache Http-клиент выполняет первоначальное рукопожатие, затем повторно отправляет запрос , но теперь нет сущности, поскольку она уже была использована для первого запроса.

Одним из решений является кэширование сущность от Клиента, но она может быть очень большой, более 1 ГБ.

Вопрос Есть ли лучшее решение, как предварительная отправка только заголовков запроса?

1 Ответ

0 голосов
/ 04 апреля 2020

Используйте рукопожатие expect-continue.

CloseableHttpClient client = HttpClients.custom()
        .setDefaultRequestConfig(
                RequestConfig.custom()
                        .setExpectContinueEnabled(true)
                        .build())
        .build();
...