Apache HttpClient - Многостраничная загрузка
Используя HttpClient, мы можем выполнять многостраничную загрузку, то есть мы можем загружать более крупные объекты меньшими частями. В этой главе мы продемонстрируем многостраничную загрузку в HTTP-клиенте, загрузив простой текстовый файл.
Как правило, любая составная загрузка состоит из трех частей.
Начало загрузки
Загрузка частей объекта
Завершение составной загрузки
Для многокомпонентной загрузки с использованием HttpClient нам необходимо выполнить следующие шаги:
Создайте составной строитель.
Добавьте к нему желаемые детали.
Завершите сборку и получите составной HttpEntity.
Создайте запрос, установив указанную выше сущность muti-part.
Выполните запрос.
Ниже приведены шаги по загрузке составной сущности с использованием библиотеки HttpClient.
Шаг 1. Создайте объект HttpClient
В createDefault() метод HttpClients class возвращает объект класса CloseableHttpClient, который является базовой реализацией интерфейса HttpClient. Используя этот метод, создайте объект HttpClient -
//Creating CloseableHttpClient object
CloseableHttpClient httpclient = HttpClients.createDefault();
Шаг 2 - Создайте объект FileBody
FileBodyКласс представляет двоичную часть тела, поддерживаемую файлом. Создайте экземпляр этого класса, передавFile объект и ContentType объект, представляющий тип содержимого.
//Creating a File object
File file = new File("sample.txt");
//Creating the FileBody object
FileBody filebody = new FileBody(file, ContentType.DEFAULT_BINARY);
Шаг 3 - Создайте MultipartEntityBuilder
В MultipartEntityBuilder класс используется для создания составной части HttpEntityобъект. Создайте его объект, используяcreate() метод (того же класса).
//Creating the MultipartEntityBuilder
MultipartEntityBuilder entitybuilder = MultipartEntityBuilder.create();
Шаг 4 - Установите режим
А MultipartEntityBuilderимеет три режима: STRICT, RFC6532 и BROWSER_COMPATIBLE. Установите желаемый режим с помощьюsetMode() метод.
//Setting the mode
entitybuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
Шаг 5 - Добавьте различные желаемые детали
Используя методы addTextBody(), addPart () и, addBinaryBody(), вы можете добавить простой текст, файлы, потоки и другие объекты в MultipartBuilder. Добавьте желаемое содержимое, используя эти методы.
//Adding text
entitybuilder.addTextBody("sample_text", "This is the text part of our file");
//Adding a file
entitybuilder.addBinaryBody("image", new File("logo.png"));
Шаг 6 - Создание единого объекта
Вы можете собрать все эти части в единое целое, используя build() метод MultipartEntityBuilderкласс. Используя этот метод, соберите все части в единыйHttpEntity.
//Building a single entity using the parts
HttpEntity mutiPartHttpEntity = entityBuilder.build();
Шаг 7 - Создайте объект RequestBuilder
Класс RequestBuilderиспользуется для построения запроса путем добавления к нему параметров. Если запрос относится к типу PUT или POST, он добавляет параметры к запросу как объект с кодировкой URL.
Создайте объект RequestBuilder (типа POST) с помощью post()метод. И передайте Uri, на который вы хотите отправить запрос, в качестве параметра.
//Building the post request object
RequestBuilder reqbuilder = RequestBuilder.post("http://httpbin.org/post");
Шаг 8 - Установите объект сущности в RequestBuilder
Установите созданный выше составной объект в RequestBuilder, используя setEntity() метод RequestBuilder класс.
//Setting the entity object to the RequestBuilder
reqbuilder.setEntity(mutiPartHttpEntity);
Шаг 9 - Создайте HttpUriRequest
Построить HttpUriRequest объект запроса с помощью build() метод RequestBuilder класс.
//Building the request
HttpUriRequest multipartRequest = reqbuilder.build();
Шаг 10 - Выполните запрос
С использованием execute() метод, выполнить запрос, построенный на предыдущем шаге (минуя запрос как параметр этого метода).
//Executing the request
HttpResponse httpresponse = httpclient.execute(multipartRequest);
пример
В следующем примере показано, как отправить составной запрос с помощью библиотеки HttpClient. В этом примере мы пытаемся отправить составной запрос, поддерживаемый файлом.
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
public class MultipartUploadExample {
public static void main(String args[]) throws Exception{
//Creating CloseableHttpClient object
CloseableHttpClient httpclient = HttpClients.createDefault();
//Creating a file object
File file = new File("sample.txt");
//Creating the FileBody object
FileBody filebody = new FileBody(file, ContentType.DEFAULT_BINARY);
//Creating the MultipartEntityBuilder
MultipartEntityBuilder entitybuilder = MultipartEntityBuilder.create();
//Setting the mode
entitybuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
//Adding text
entitybuilder.addTextBody("sample_text", "This is the text part of our file");
//Adding a file
entitybuilder.addBinaryBody("image", new File("logo.png"));
//Building a single entity using the parts
HttpEntity mutiPartHttpEntity = entitybuilder.build();
//Building the RequestBuilder request object
RequestBuilder reqbuilder = RequestBuilder.post("http://httpbin.org/post");
//Set the entity object to the RequestBuilder
reqbuilder.setEntity(mutiPartHttpEntity);
//Building the request
HttpUriRequest multipartRequest = reqbuilder.build();
//Executing the request
HttpResponse httpresponse = httpclient.execute(multipartRequest);
//Printing the status and the contents of the response
System.out.println(EntityUtils.toString(httpresponse.getEntity()));
System.out.println(httpresponse.getStatusLine());
}
}
Выход
При выполнении вышеуказанная программа генерирует следующий вывод:
{
"args": {},
"data": "",
"files": {
"image": "data:application/octets66PohrH3IWNk1FzpohfdXPIfv9X3490FGcuXsHn9X0piCwomF/xdgADZ9GsfSyvLYAAAAAE
lFTkSuQmCC"
},
"form": {
"sample_text": "This is the text part of our file"
},
"headers": {
"Accept-Encoding": "gzip,deflate",
"Connection": "close",
"Content-Length": "11104",
"Content-Type": "multipart/form-data;
boundary=UFJbPHT7mTwpVq70LpZgCi5I2nvxd1g-I8Rt",
"Host": "httpbin.org",
"User-Agent": "Apache-HttpClient/4.5.6 (Java/1.8.0_91)"
},
"json": null,
"origin": "117.216.245.180",
"url": "http://httpbin.org/post"
}
HTTP/1.1 200 OK