Apache HttpClient - Upload de várias partes

Usando HttpClient, podemos fazer upload de várias partes, ou seja, podemos fazer upload de objetos maiores em partes menores. Neste capítulo, demonstramos o upload de várias partes no cliente HTTP através do upload de um arquivo de texto simples.

Em geral, qualquer upload de várias partes contém três partes.

  • Iniciação do upload

  • Carregando as partes do objeto

  • Concluindo o upload de várias partes

Para o upload de várias partes usando HttpClient, precisamos seguir as etapas abaixo -

  • Crie um construtor multiparte.

  • Adicione as partes desejadas a ele.

  • Conclua a construção e obtenha uma HttpEntity multipart.

  • Solicitação de compilação configurando a entidade muti-part acima.

  • Execute a solicitação.

A seguir estão as etapas para fazer upload de uma entidade multipartes usando a biblioteca HttpClient.

Etapa 1 - Criar um objeto HttpClient

o createDefault() método do HttpClients classe retorna um objeto da classe CloseableHttpClient, que é a implementação básica da interface HttpClient. Usando este método, crie um objeto HttpClient -

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

Etapa 2 - Criar um objeto FileBody

FileBodyclasse representa a parte binária do corpo apoiada por um arquivo. Instancie esta classe passando umFile objeto e um ContentType objeto que representa o tipo de conteúdo.

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

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

Etapa 3 - Crie um MultipartEntityBuilder

o MultipartEntityBuilder classe é usada para construir o multi-part HttpEntityobjeto. Crie seu objeto usando ocreate() método (da mesma classe).

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

Etapa 4 - definir o modo

UMA MultipartEntityBuildertem três modos: STRICT, RFC6532 e BROWSER_COMPATIBLE. Defina-o para o modo desejado usando osetMode() método.

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

Etapa 5 - Adicionar várias partes desejadas

Usando os métodos addTextBody(), addPart () e, addBinaryBody(), você pode adicionar texto simples, arquivos, fluxos e outros objetos a um MultipartBuilder. Adicione o conteúdo desejado usando esses 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"));

Etapa 6 - Construindo uma entidade única

Você pode construir todas essas partes em uma única entidade usando o build() método do MultipartEntityBuilderclasse. Usando este método, construa todas as peças em um únicoHttpEntity.

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

Etapa 7 - Criar um objeto RequestBuilder

A classe RequestBuilderé usado para construir a solicitação adicionando parâmetros a ela. Se a solicitação for do tipo PUT ou POST, ele adiciona os parâmetros à solicitação como entidade codificada de URL.

Crie um objeto RequestBuilder (do tipo POST) usando o post()método. E passe como parâmetro o Uri para o qual você deseja enviar a solicitação.

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

Etapa 8 - Defina o objeto de entidade para o RequestBuilder

Defina a entidade multiparte criada acima para o RequestBuilder usando o setEntity() método do RequestBuilder classe.

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

Etapa 9 - Construir o HttpUriRequest

Construir um HttpUriRequest objeto de solicitação usando o build() método do RequestBuilder classe.

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

Etapa 10 - Executar a solicitação

Usando o execute() método, execute a solicitação criada na etapa anterior (ignorando a solicitação como um parâmetro para este método).

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

Exemplo

O exemplo a seguir demonstra como enviar uma solicitação multiparte usando a biblioteca HttpClient. Neste exemplo, estamos tentando enviar uma solicitação multiparte apoiada por um arquivo.

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

Resultado

Ao ser executado, o programa acima gera a seguinte saída -

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