Apache HttpClient - Caricamento in più parti
Utilizzando HttpClient, possiamo eseguire il caricamento in più parti, ovvero possiamo caricare oggetti più grandi in parti più piccole. In questo capitolo viene illustrato il caricamento in più parti nel client HTTP caricando un semplice file di testo.
In generale, qualsiasi caricamento in più parti contiene tre parti.
Avvio del caricamento
Caricamento delle parti dell'oggetto
Completamento del caricamento in più parti
Per il caricamento in più parti utilizzando HttpClient, è necessario seguire i passaggi seguenti:
Crea un generatore in più parti.
Aggiungi le parti desiderate ad esso.
Completa la compilazione e ottieni un HttpEntity in più parti.
Compila la richiesta impostando l'entità multiparte sopra.
Esegui la richiesta.
Di seguito sono riportati i passaggi per caricare un'entità multiparte utilizzando la libreria HttpClient.
Passaggio 1: creare un oggetto HttpClient
Il createDefault() metodo del HttpClients class restituisce un oggetto della classe CloseableHttpClient, che è l'implementazione di base dell'interfaccia HttpClient. Utilizzando questo metodo, crea un oggetto HttpClient -
//Creating CloseableHttpClient object
CloseableHttpClient httpclient = HttpClients.createDefault();
Passaggio 2: creare un oggetto FileBody
FileBodyclass rappresenta la parte del corpo binaria supportata da un file. Crea un'istanza di questa classe passando un fileFile oggetto e a ContentType oggetto che rappresenta il tipo di contenuto.
//Creating a File object
File file = new File("sample.txt");
//Creating the FileBody object
FileBody filebody = new FileBody(file, ContentType.DEFAULT_BINARY);
Passaggio 3: creare un MultipartEntityBuilder
Il MultipartEntityBuilder class viene utilizzata per costruire il multiparte HttpEntityoggetto. Crea il suo oggetto usando ilcreate() metodo (della stessa classe).
//Creating the MultipartEntityBuilder
MultipartEntityBuilder entitybuilder = MultipartEntityBuilder.create();
Passaggio 4: impostare la modalità
UN MultipartEntityBuilderha tre modalità: STRICT, RFC6532 e BROWSER_COMPATIBLE. Impostarlo sulla modalità desiderata utilizzando ilsetMode() metodo.
//Setting the mode
entitybuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
Passaggio 5: aggiungere varie parti desiderate
Utilizzando i metodi addTextBody(), addPart () e, addBinaryBody(), puoi aggiungere testo semplice, file, flussi e altri oggetti a un file MultipartBuilder. Aggiungi i contenuti desiderati usando questi metodi.
//Adding text
entitybuilder.addTextBody("sample_text", "This is the text part of our file");
//Adding a file
entitybuilder.addBinaryBody("image", new File("logo.png"));
Passaggio 6: creazione di una singola entità
Puoi costruire tutte queste parti in una singola entità usando il build() metodo del MultipartEntityBuilderclasse. Usando questo metodo, costruisci tutte le parti in un unico fileHttpEntity.
//Building a single entity using the parts
HttpEntity mutiPartHttpEntity = entityBuilder.build();
Passaggio 7: creare un oggetto RequestBuilder
La classe RequestBuilderviene utilizzato per creare la richiesta aggiungendovi parametri. Se la richiesta è di tipo PUT o POST, aggiunge i parametri alla richiesta come entità con codifica URL.
Crea un oggetto RequestBuilder (di tipo POST) utilizzando l'estensione post()metodo. E passa l'URI a cui vuoi inviare la richiesta come parametro.
//Building the post request object
RequestBuilder reqbuilder = RequestBuilder.post("http://httpbin.org/post");
Passaggio 8: impostare l'oggetto entità su RequestBuilder
Impostare l'entità multiparte sopra creata su RequestBuilder utilizzando il setEntity() metodo del RequestBuilder classe.
//Setting the entity object to the RequestBuilder
reqbuilder.setEntity(mutiPartHttpEntity);
Passaggio 9: crea HttpUriRequest
Costruire un HttpUriRequest oggetto richiesta utilizzando il build() metodo del RequestBuilder classe.
//Building the request
HttpUriRequest multipartRequest = reqbuilder.build();
Passaggio 10: eseguire la richiesta
Usando il execute() , esegue la richiesta costruita nel passaggio precedente (ignorando la richiesta come parametro di questo metodo).
//Executing the request
HttpResponse httpresponse = httpclient.execute(multipartRequest);
Esempio
L'esempio seguente mostra come inviare una richiesta multiparte usando la libreria HttpClient. In questo esempio, stiamo cercando di inviare una richiesta in più parti supportata da un file.
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());
}
}
Produzione
In esecuzione, il programma precedente genera il seguente output:
{
"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