Comment puis-je créer une requête POST multipart / form-data en utilisant Java?

À l’époque de la version 3.x d’Apache Commons HttpClient, il était possible de faire une requête POST multipart / form-data ( un exemple de 2004 ). Malheureusement, cela n’est plus possible dans la version 4.0 de HttpClient .

Pour notre activité principale “HTTP”, multipart est quelque peu hors de scope. Nous aimerions utiliser un code en plusieurs parties géré par un autre projet pour lequel il est prévu, mais je n’en connais aucun. Il y a quelques années, nous avons essayé de déplacer le code multipart vers commons-codec, mais je ne suis pas parti. Oleg a récemment mentionné un autre projet qui a un code d’parsing en plusieurs parties et qui pourrait être intéressé par notre code de formatage en plusieurs parties. Je ne connais pas le statut actuel à ce sujet. ( http://www.nabble.com/multipart-form-data-in-4.0-td14224819.html )

Est-ce que quelqu’un est au courant d’une bibliothèque Java qui me permet d’écrire un client HTTP capable de créer une requête POST multipart / form-data?

Contexte: Je souhaite utiliser l’ API à distance de Zoho Writer .

    Nous utilisons HttpClient 4.x pour créer un post multipart de fichier.

    MISE À JOUR : À partir de HttpClient 4.3 , certaines classes sont obsolètes. Voici le code avec la nouvelle API:

    CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost uploadFile = new HttpPost("..."); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addTextBody("field1", "yes", ContentType.TEXT_PLAIN); // This attaches the file to the POST: File f = new File("[/path/to/upload]"); builder.addBinaryBody( "file", new FileInputStream(f), ContentType.APPLICATION_OCTET_STREAM, f.getName() ); HttpEntity multipart = builder.build(); uploadFile.setEntity(multipart); CloseableHttpResponse response = httpClient.execute(uploadFile); HttpEntity responseEntity = response.getEntity(); 

    Voici l’extrait de code d’origine avec l’ API HttpClient 4.0 obsolète :

     HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); FileBody bin = new FileBody(new File(fileName)); SsortingngBody comment = new SsortingngBody("Filename: " + fileName); MultipartEntity reqEntity = new MultipartEntity(); reqEntity.addPart("bin", bin); reqEntity.addPart("comment", comment); httppost.setEntity(reqEntity); HttpResponse response = httpclient.execute(httppost); HttpEntity resEntity = response.getEntity(); 

    Ce sont les dépendances Maven que j’ai.

    Code Java:

     HttpClient httpclient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); FileBody uploadFilePart = new FileBody(uploadFile); MultipartEntity reqEntity = new MultipartEntity(); reqEntity.addPart("upload-file", uploadFilePart); httpPost.setEntity(reqEntity); HttpResponse response = httpclient.execute(httpPost); 

    Dépendances Maven dans pom.xml:

      org.apache.httpcomponents httpclient 4.0.1 comstack   org.apache.httpcomponents httpmime 4.0.1 comstack  

    Si la taille des fichiers JAR est importante (par exemple en cas d’applet), on peut aussi utiliser directement httpmime avec java.net.HttpURLConnection au lieu de HttpClient.

     httpclient-4.2.4: 423KB httpmime-4.2.4: 26KB httpcore-4.2.4: 222KB commons-codec-1.6: 228KB commons-logging-1.1.1: 60KB Sum: 959KB httpmime-4.2.4: 26KB httpcore-4.2.4: 222KB Sum: 248KB 

    Code:

     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestMethod("POST"); FileBody fileBody = new FileBody(new File(fileName)); MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.STRICT); multipartEntity.addPart("file", fileBody); connection.setRequestProperty("Content-Type", multipartEntity.getContentType().getValue()); OutputStream out = connection.getOutputStream(); try { multipartEntity.writeTo(out); } finally { out.close(); } int status = connection.getResponseCode(); ... 

    Dépendance dans pom.xml:

      org.apache.httpcomponents httpmime 4.2.4  

    Utilisez ce code pour télécharger des images ou tout autre fichier sur le serveur en utilisant post in multipart.

     import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.ResponseHandler; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.entity.mime.content.SsortingngBody; import org.apache.http.impl.client.BasicResponseHandler; import org.apache.http.impl.client.DefaultHttpClient; public class SimplePostRequestTest { public static void main(Ssortingng[] args) throws UnsupportedEncodingException, IOException { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://soffr.miximages.com/java/cd.png")); SsortingngBody id = new SsortingngBody("3"); MultipartEntity reqEntity = new MultipartEntity(); reqEntity.addPart("upload_image", bin); reqEntity.addPart("id", id); reqEntity.addPart("image_title", new SsortingngBody("CoolPic")); httppost.setEntity(reqEntity); System.out.println("Requesting : " + httppost.getRequestLine()); ResponseHandler responseHandler = new BasicResponseHandler(); Ssortingng responseBody = httpclient.execute(httppost, responseHandler); System.out.println("responseBody : " + responseBody); } catch (ClientProtocolException e) { } finally { httpclient.getConnectionManager().shutdown(); } } } 

    il faut télécharger les fichiers ci-dessous.

    les bibliothèques sont httpclient-4.1.2.jar, httpcore-4.1.2.jar, httpmime-4.1.2.jar, httpclient-cache-4.1.2.jar, commons-codec.jar et commons-logging-1.1.1.jar à être en classe.

    Vous pouvez également utiliser REST Assured qui repose sur le client HTTP. C’est très simple:

     given().multiPart(new File("/somedir/file.bin")).when().post("/fileUpload"); 

    httpcomponents-client-4.0.1 fonctionné pour moi. Cependant, je devais append le apache-mime4j-0.6.jar jar externe apache-mime4j-0.6.jar ( org.apache.james.mime4j ) sinon reqEntity.addPart("bin", bin); ne comstackrait pas. Maintenant, ça marche comme du charme.

    J’ai trouvé cet exemple dans le Guide de démarrage rapide d’Apache. C’est pour la version 4.5:

     /** * Example how to use multipart/form encoded POST request. */ public class ClientMultipartFormPost { public static void main(Ssortingng[] args) throws Exception { if (args.length != 1) { System.out.println("File path not given"); System.exit(1); } CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpPost httppost = new HttpPost("http://localhost:8080" + "/servlets-examples/servlet/RequestInfoExample"); FileBody bin = new FileBody(new File(args[0])); SsortingngBody comment = new SsortingngBody("A binary file of some kind", ContentType.TEXT_PLAIN); HttpEntity reqEntity = MultipartEntityBuilder.create() .addPart("bin", bin) .addPart("comment", comment) .build(); httppost.setEntity(reqEntity); System.out.println("executing request " + httppost.getRequestLine()); CloseableHttpResponse response = httpclient.execute(httppost); try { System.out.println("----------------------------------------"); System.out.println(response.getStatusLine()); HttpEntity resEntity = response.getEntity(); if (resEntity != null) { System.out.println("Response content length: " + resEntity.getContentLength()); } EntityUtils.consume(resEntity); } finally { response.close(); } } finally { httpclient.close(); } } } 

    Nous avons une implémentation pure Java de soumission de forme multipart sans utiliser de dépendances externes ou de bibliothèques en dehors de jdk. Référer https://github.com/atulsm/https-multipart-purejava/blob/master/src/main/java/com/atul/MultipartPure.java

     private static Ssortingng body = "{\"key1\":\"val1\", \"key2\":\"val2\"}"; private static Ssortingng subdata1 = "@@ -2,3 +2,4 @@\r\n"; private static Ssortingng subdata2 = "subdata2"; public static void main(Ssortingng[] args) throws Exception{ Ssortingng url = "https://" + ip + ":" + port + "/dataupload"; Ssortingng token = "Basic "+ Base64.getEncoder().encodeToSsortingng((userName+":"+password).getBytes()); MultipartBuilder multipart = new MultipartBuilder(url,token); multipart.addFormField("entity", "main", "application/json",body); multipart.addFormField("attachment", "subdata1", "application/octet-stream",subdata1); multipart.addFormField("attachment", "subdata2", "application/octet-stream",subdata2); List response = multipart.finish(); for (Ssortingng line : response) { System.out.println(line); } }