Apache HttpClient - przesyłanie wieloczęściowe

Korzystając z HttpClient, możemy wykonać przesyłanie wieloczęściowe, tj. Możemy przesłać większe obiekty w mniejszych częściach. W tym rozdziale przedstawiamy przesyłanie wieloczęściowe w kliencie HTTP, przesyłając prosty plik tekstowy.

Ogólnie rzecz biorąc, każde przesyłanie wielu części składa się z trzech części.

  • Rozpoczęcie przesyłania

  • Przesyłanie części obiektu

  • Kończenie przesyłania Multipart

W przypadku przesyłania wieloczęściowego za pomocą HttpClient, musimy wykonać poniższe kroki -

  • Utwórz kreatora wieloczęściowego.

  • Dodaj do niego żądane części.

  • Ukończ kompilację i uzyskaj wieloczęściowy HttpEntity.

  • Utwórz żądanie, ustawiając powyższą jednostkę wieloczęściową.

  • Wykonaj żądanie.

Poniżej przedstawiono kroki, aby przekazać jednostkę wieloczęściową przy użyciu biblioteki HttpClient.

Krok 1 - Utwórz obiekt HttpClient

Plik createDefault() metoda HttpClients class zwraca obiekt klasy CloseableHttpClient, który jest podstawową implementacją interfejsu HttpClient. Za pomocą tej metody utwórz obiekt HttpClient -

//Creating CloseableHttpClient object
CloseableHttpClient httpclient = HttpClients.createDefault();

Krok 2 - Utwórz obiekt FileBody

FileBodyklasa reprezentuje binarną część treści wspieraną przez plik. Utwórz wystąpienie tej klasy, przekazując plikFile obiekt i a ContentType obiekt reprezentujący typ treści.

//Creating a File object
File file = new File("sample.txt");

//Creating the FileBody object
FileBody filebody = new FileBody(file, ContentType.DEFAULT_BINARY);

Krok 3 - Utwórz MultipartEntityBuilder

Plik MultipartEntityBuilder klasa służy do budowania wieloczęściowego HttpEntityobiekt. Utwórz jego obiekt za pomocącreate() metoda (tej samej klasy).

//Creating the MultipartEntityBuilder
MultipartEntityBuilder entitybuilder = MultipartEntityBuilder.create();

Krok 4 - Ustaw tryb

ZA MultipartEntityBuilderma trzy tryby: STRICT, RFC6532 i BROWSER_COMPATIBLE. Ustaw żądany tryb za pomocąsetMode() metoda.

//Setting the mode
entitybuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

Krok 5 - Dodaj różne żądane części

Korzystanie z metod addTextBody()addPart () i, addBinaryBody(), możesz dodać prosty tekst, pliki, strumienie i inne obiekty do pliku MultipartBuilder. Dodaj żądaną zawartość za pomocą tych metod.

//Adding text
entitybuilder.addTextBody("sample_text", "This is the text part of our file");
//Adding a file
entitybuilder.addBinaryBody("image", new File("logo.png"));

Krok 6 - Budowanie pojedynczej jednostki

Możesz zbudować wszystkie te części w pojedynczej encji przy użyciu build() metoda MultipartEntityBuilderklasa. Korzystając z tej metody, połącz wszystkie części w jedenHttpEntity.

//Building a single entity using the parts
HttpEntity mutiPartHttpEntity = entityBuilder.build();

Krok 7 - Utwórz obiekt RequestBuilder

Klasa RequestBuildersłuży do budowania żądania poprzez dodawanie do niego parametrów. Jeśli żądanie jest typu PUT lub POST, dodaje parametry do żądania jako jednostkę zakodowaną w adresie URL.

Utwórz obiekt RequestBuilder (typu POST) przy użyciu post()metoda. I przekaż Uri, do którego chcesz wysłać żądanie, jako parametr.

//Building the post request object
RequestBuilder reqbuilder = RequestBuilder.post("http://httpbin.org/post");

Krok 8 - Ustaw obiekt jednostki na RequestBuilder

Ustaw powyższą utworzoną jednostkę wieloczęściową na RequestBuilder przy użyciu setEntity() metoda RequestBuilder klasa.

//Setting the entity object to the RequestBuilder
reqbuilder.setEntity(mutiPartHttpEntity);

Krok 9 - Zbuduj HttpUriRequest

Zbudować HttpUriRequest żądanie obiektu za pomocą build() metoda RequestBuilder klasa.

//Building the request
HttpUriRequest multipartRequest = reqbuilder.build();

Krok 10 - Wykonaj żądanie

Używając execute() metoda, wykonaj żądanie zbudowane w poprzednim kroku (pomijając żądanie jako parametr tej metody).

//Executing the request
HttpResponse httpresponse = httpclient.execute(multipartRequest);

Przykład

Poniższy przykład ilustruje sposób wysyłania żądania wieloczęściowego przy użyciu biblioteki HttpClient. W tym przykładzie próbujemy wysłać żądanie wieloczęściowe poparte plikiem.

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());
   }
}

Wynik

Podczas wykonywania powyższy program generuje następujące dane wyjściowe -

{
   "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