Caricamento in più parti con HttpClient 4

1. Panoramica

In questo tutorial, illustreremo come eseguire un'operazione di caricamento in più parti utilizzando HttpClient 4 .

Useremo //echo.200please.com come server di prova perché è pubblico e accetta la maggior parte dei tipi di contenuto.

Se vuoi approfondire e imparare altre cose interessanti che puoi fare con HttpClient, vai al tutorial principale di HttpClient.

2. Utilizzo del metodo AddPart

Iniziamo esaminando l' oggetto MultipartEntityBuilder per aggiungere parti a un'entità Http che verrà quindi caricata tramite un'operazione POST.

Si tratta di un metodo generico per aggiungere parti a un HttpEntity che rappresenta il modulo.

Esempio 2.1. - Caricamento di un modulo con due parti di testo e un file

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

Si noti che stiamo istanziando l' oggetto File specificando anche il valore ContentType che deve essere utilizzato dal server.

Inoltre, nota che il metodo addPart ha due argomenti, che agiscono come coppie chiave / valore per il modulo. Questi sono rilevanti solo se il lato server si aspetta e utilizza effettivamente i nomi dei parametri, altrimenti vengono semplicemente ignorati.

3. Utilizzo dei metodi addBinaryBody e addTextBody

Un modo più diretto per creare un'entità multiparte consiste nell'usare i metodi addBinaryBody e AddTextBody . Questi metodi funzionano per caricare testo, file, matrici di caratteri e oggetti InputStream . Illustriamo come con semplici esempi.

Esempio 3.1. - Caricamento di testo e una parte di file di testo

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

Notare che gli oggetti FileBody e StringBody non sono necessari qui.

Inoltre, la maggior parte dei server non controlla il ContentType del corpo del testo, quindi il metodo addTextBody potrebbe omettere il valore ContentType .

L' API addBinaryBody accetta un ContentType , ma è anche possibile creare l'entità solo da un corpo binario e il nome del parametro del form che contiene il file. Come indicato nella sezione precedente, alcuni server non riconosceranno il file se il valore ContentType non è specificato.

Successivamente, aggiungeremo un file zip come InputStream, mentre il file immagine verrà aggiunto come oggetto File :

Esempio 3.2. - Caricamento di un fileFile zip, un file immagine e una parte di testo

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

Si noti che il valore ContentType può essere creato al volo, come nel caso dell'esempio sopra per il file zip.

Infine, non tutti i server riconoscono le parti InputStream . Il server che abbiamo istanziato nella prima riga del codice riconosce InputStream s.

Vediamo ora un altro esempio in cui addBinaryBody sta lavorando direttamente con un array di byte:

Esempio 3.3. - Caricamento di un array di byte e testo

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

Notare il ContentType , che ora specifica i dati binari.

4. Conclusione

Questo articolo ha presentato MultipartEntityBuilder come un oggetto flessibile che offre più scelte API per creare un modulo multiparte.

Gli esempi hanno anche mostrato come usare HttpClient per caricare un HttpEntity simile a un'entità modulo.

L'implementazione di tutti questi esempi e frammenti di codice può essere trovata nel nostro progetto GitHub : questo è un progetto basato su Eclipse, quindi dovrebbe essere facile da importare ed eseguire così com'è.