Carga de varias partes con HttpClient 4

1. Información general

En este tutorial, ilustraremos cómo realizar una operación de carga de varias partes usando HttpClient 4 .

Usaremos //echo.200please.com como servidor de prueba porque es público y acepta la mayoría de los tipos de contenido.

Si desea profundizar y aprender otras cosas interesantes que puede hacer con HttpClient , diríjase al tutorial principal de HttpClient.

2. Uso del método AddPart

Comencemos mirando el objeto MultipartEntityBuilder para agregar partes a una entidad Http que luego se cargará mediante una operación POST.

Este es un método genérico para agregar partes a una HttpEntity que representa el formulario.

Ejemplo 2.1. - Carga de un formulario con dos partes de texto y un archivo

File file = new File(textFileName); HttpPost post = new HttpPost("//echo.200please.com"); FileBody fileBody = new FileBody(file, ContentType.DEFAULT_BINARY); StringBody stringBody1 = new StringBody("Message 1", ContentType.MULTIPART_FORM_DATA); StringBody stringBody2 = new StringBody("Message 2", ContentType.MULTIPART_FORM_DATA); // MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addPart("upfile", fileBody); builder.addPart("text1", stringBody1); builder.addPart("text2", stringBody2); HttpEntity entity = builder.build(); // post.setEntity(entity); HttpResponse response = client.execute(post);

Tenga en cuenta que estamos creando una instancia del objeto File especificando también el valor ContentType que utilizará el servidor.

Además, tenga en cuenta que el método addPart tiene dos argumentos, que actúan como pares clave / valor para el formulario. Estos solo son relevantes si el lado del servidor realmente espera y usa nombres de parámetros; de lo contrario, simplemente se ignoran.

3. Uso de los métodos addBinaryBody y addTextBody

Una forma más directa de crear una entidad multiparte es utilizar los métodos addBinaryBody y AddTextBody . Estos métodos funcionan para cargar texto, archivos, matrices de caracteres y objetos InputStream . Ilustremos cómo con ejemplos sencillos.

Ejemplo 3.1. - Carga de texto y una parte del archivo de texto

HttpPost post = new HttpPost("//echo.200please.com"); File file = new File(textFileName); String message = "This is a multipart post"; MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody("upfile", file, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody("text", message, ContentType.DEFAULT_BINARY); // HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);

Tenga en cuenta que los objetos FileBody y StringBody no son necesarios aquí.

También es importante que la mayoría de los servidores no comprueben el ContentType del cuerpo del texto, por lo que el método addTextBody puede omitir el valor ContentType .

La API addBinaryBody acepta un ContentType , pero también es posible crear la entidad solo desde un cuerpo binario y el nombre del parámetro de formulario que contiene el archivo. Como se indicó en la sección anterior, algunos servidores no reconocerán el archivo si no se especifica el valor de ContentType .

A continuación, agregaremos un archivo zip como InputStream, mientras que el archivo de imagen se agregará como objeto File :

Ejemplo 3.2. - Subiendo unArchivo zip, un archivo de imagen y una parte de texto

HttpPost post = new HttpPost("//echo.200please.com"); InputStream inputStream = new FileInputStream(zipFileName); File file = new File(imageFileName); String message = "This is a multipart post"; MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody ("upfile", file, ContentType.DEFAULT_BINARY, imageFileName); builder.addBinaryBody ("upstream", inputStream, ContentType.create("application/zip"), zipFileName); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); // HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);

Tenga en cuenta que el valor de ContentType se puede crear sobre la marcha, como es el caso en el ejemplo anterior para el archivo zip.

Finalmente, no todos los servidores reconocen las partes InputStream . El servidor que instanciamos en la primera línea del código reconoce InputStream s.

Veamos ahora otro ejemplo donde addBinaryBody está trabajando directamente con una matriz de bytes:

Ejemplo 3.3. - Carga de una matriz de bytes y texto

HttpPost post = new HttpPost("//echo.200please.com"); String message = "This is a multipart post"; byte[] bytes = "binary code".getBytes(); // MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody("upfile", bytes, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); // HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);

Observe el ContentType , que ahora especifica datos binarios.

4. Conclusión

Este artículo ha presentado MultipartEntityBuilder como un objeto flexible que ofrece múltiples opciones de API para crear un formulario multiparte.

Los ejemplos también han mostrado cómo usar HttpClient para cargar una HttpEntity similar a una entidad de formulario.

La implementación de todos estos ejemplos y fragmentos de código se puede encontrar en nuestro proyecto GitHub : este es un proyecto basado en Eclipse, por lo que debería ser fácil de importar y ejecutar tal como está.