Apache HttpClient - Carga de varias partes

Usando HttpClient, podemos realizar cargas multiparte, es decir, podemos cargar objetos más grandes en partes más pequeñas. En este capítulo, demostramos la carga de varias partes en el cliente HTTP cargando un archivo de texto simple.

En general, cualquier carga de varias partes contiene tres partes.

  • Inicio de la carga

  • Subiendo las partes del objeto

  • Completando la carga multiparte

Para la carga de varias partes usando HttpClient, debemos seguir los pasos a continuación:

  • Cree un constructor de varias partes.

  • Agregue las partes deseadas.

  • Complete la compilación y obtenga una HttpEntity de varias partes.

  • Solicitud de compilación configurando la entidad de varias partes anterior.

  • Ejecute la solicitud.

Los siguientes son los pasos para cargar una entidad multiparte usando la biblioteca HttpClient.

Paso 1: crea un objeto HttpClient

los createDefault() método del HttpClients clase devuelve un objeto de la clase CloseableHttpClient, que es la implementación base de la interfaz HttpClient. Usando este método, cree un objeto HttpClient -

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

Paso 2: crea un objeto FileBody

FileBodyclass representa la parte del cuerpo binario respaldada por un archivo. Cree una instancia de esta clase pasando unFile objeto y un ContentType objeto que representa el tipo de contenido.

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

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

Paso 3: crear un MultipartEntityBuilder

los MultipartEntityBuilder la clase se usa para construir el multiparte HttpEntityobjeto. Crea su objeto usando elcreate() método (de la misma clase).

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

Paso 4: establece el modo

UNA MultipartEntityBuildertiene tres modos: STRICT, RFC6532 y BROWSER_COMPATIBLE. Configúrelo en el modo deseado utilizando elsetMode() método.

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

Paso 5: agregue varias partes deseadas

Usando los métodos addTextBody(), addPart () y, addBinaryBody(), puede agregar texto simple, archivos, secuencias y otros objetos a un MultipartBuilder. Agregue el contenido deseado usando estos métodos.

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

Paso 6: creación de una entidad única

Puede construir todas estas partes en una sola entidad usando el build() método del MultipartEntityBuilderclase. Usando este método, construya todas las partes en una solaHttpEntity.

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

Paso 7: crear un objeto RequestBuilder

La clase RequestBuilderse utiliza para crear una solicitud añadiéndole parámetros. Si la solicitud es de tipo PUT o POST, agrega los parámetros a la solicitud como entidad codificada en URL.

Cree un objeto RequestBuilder (de tipo POST) utilizando el post()método. Y pasa la Uri a la que querías enviar la solicitud como parámetro.

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

Paso 8: establece el objeto de la entidad en RequestBuilder

Establezca la entidad multiparte creada anteriormente en RequestBuilder usando el setEntity() método del RequestBuilder clase.

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

Paso 9: compila HttpUriRequest

Construir un HttpUriRequest Solicitar objeto usando el build() método del RequestBuilder clase.

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

Paso 10: ejecutar la solicitud

Utilizando la execute() , ejecute la solicitud construida en el paso anterior (omitiendo la solicitud como parámetro de este método).

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

Ejemplo

El siguiente ejemplo demuestra cómo enviar una solicitud de varias partes utilizando la biblioteca HttpClient. En este ejemplo, estamos intentando enviar una solicitud de varias partes respaldada por un archivo.

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

Salida

Al ejecutarse, el programa anterior genera la siguiente salida:

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