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