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