Apache HttpClient - Téléchargement en plusieurs parties

En utilisant HttpClient, nous pouvons effectuer un téléchargement en plusieurs parties, c'est-à-dire que nous pouvons télécharger des objets plus volumineux dans des parties plus petites. Dans ce chapitre, nous démontrons le téléchargement en plusieurs parties dans le client HTTP en téléchargeant un simple fichier texte.

En général, tout téléchargement en plusieurs parties contient trois parties.

  • Lancement du téléchargement

  • Téléchargement des parties d'objet

  • Terminer le téléchargement en plusieurs parties

Pour le téléchargement en plusieurs parties à l'aide de HttpClient, nous devons suivre les étapes ci-dessous -

  • Créez un générateur en plusieurs parties.

  • Ajoutez-y les pièces souhaitées.

  • Terminez la construction et obtenez un HttpEntity en plusieurs parties.

  • Demande de génération en définissant l'entité en plusieurs parties ci-dessus.

  • Exécutez la demande.

Voici les étapes pour télécharger une entité en plusieurs parties à l'aide de la bibliothèque HttpClient.

Étape 1 - Créer un objet HttpClient

le createDefault() méthode de la HttpClients class renvoie un objet de la classe CloseableHttpClient, qui est l'implémentation de base de l'interface HttpClient. À l'aide de cette méthode, créez un objet HttpClient -

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

Étape 2 - Créer un objet FileBody

FileBodyclass représente la partie du corps binaire sauvegardée par un fichier. Instanciez cette classe en passant unFile objet et un ContentType objet représentant le type du contenu.

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

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

Étape 3 - Créer un MultipartEntityBuilder

le MultipartEntityBuilder la classe est utilisée pour construire le multi-part HttpEntityobjet. Créez son objet à l'aide ducreate() méthode (de la même classe).

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

Étape 4 - Réglez le mode

UNE MultipartEntityBuildera trois modes: STRICT, RFC6532 et BROWSER_COMPATIBLE. Réglez-le sur le mode souhaité à l'aide dusetMode() méthode.

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

Étape 5 - Ajouter diverses pièces souhaitées

Utiliser les méthodes addTextBody(), addPart () et, addBinaryBody(), vous pouvez ajouter du texte simple, des fichiers, des flux et d'autres objets à un MultipartBuilder. Ajoutez le contenu souhaité à l'aide de ces méthodes.

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

Étape 6 - Construire une seule entité

Vous pouvez créer toutes ces pièces en une seule entité en utilisant le build() méthode de la MultipartEntityBuilderclasse. En utilisant cette méthode, créez toutes les pièces en un seulHttpEntity.

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

Étape 7 - Créer un objet RequestBuilder

La classe RequestBuilderest utilisé pour créer une requête en y ajoutant des paramètres. Si la requête est de type PUT ou POST, elle ajoute les paramètres à la requête en tant qu'entité encodée en URL.

Créez un objet RequestBuilder (de type POST) à l'aide du post()méthode. Et passez l'URI auquel vous vouliez envoyer la requête en tant que paramètre.

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

Étape 8 - Définissez l'objet d'entité sur RequestBuilder

Définissez l'entité en plusieurs parties créée ci-dessus sur RequestBuilder à l'aide du setEntity() méthode de la RequestBuilder classe.

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

Étape 9 - Créez le HttpUriRequest

Construire un HttpUriRequest objet de requête à l'aide de build() méthode de la RequestBuilder classe.

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

Étape 10 - Exécutez la demande

En utilisant le execute() méthode, exécutez la requête générée à l'étape précédente (en contournant la requête en tant que paramètre de cette méthode).

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

Exemple

L'exemple suivant montre comment envoyer une requête en plusieurs parties à l'aide de la bibliothèque HttpClient. Dans cet exemple, nous essayons d'envoyer une requête en plusieurs parties soutenue par un fichier.

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

Production

Lors de l'exécution, le programme ci-dessus génère la sortie suivante -

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