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