Учебники

Apache HttpClient — Multipart Upload

Используя HttpClient, мы можем выполнять многокомпонентную загрузку, то есть мы можем загружать большие объекты небольшими частями. В этой главе мы продемонстрируем многоэтапную загрузку в HTTP-клиенте, загрузив простой текстовый файл.

В общем, любая многочастная загрузка состоит из трех частей.

  • Начало загрузки

  • Загрузка частей объекта

  • Завершение многочастной загрузки

Начало загрузки

Загрузка частей объекта

Завершение многочастной загрузки

Для многоэтапной загрузки с использованием HttpClient нам необходимо выполнить следующие шаги:

  • Создать многокомпонентный конструктор.

  • Добавьте нужные части к нему.

  • Завершите сборку и получите составную часть HttpEntity.

  • Создайте запрос, установив вышеуказанный объект muti-part.

  • Выполнить запрос.

Создать многокомпонентный конструктор.

Добавьте нужные части к нему.

Завершите сборку и получите составную часть HttpEntity.

Создайте запрос, установив вышеуказанный объект muti-part.

Выполнить запрос.

Ниже приведены шаги для загрузки составного объекта с использованием библиотеки HttpClient.

Шаг 1 — Создайте объект HttpClient

Метод createDefault () класса HttpClients возвращает объект класса 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());
   }
} 

Выход

При выполнении вышеупомянутая программа генерирует следующий вывод —