107 votes

Comment puis-je faire une demande POST multipart/form-data en utilisant Java ?

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

Pour notre activité principale "HTTP", le multipart est quelque peu hors de portée. Nous aimerions beaucoup utiliser le code multipart maintenu par un certain autre projet pour lequel il est dans le champ d'application, mais je n'en connais aucun. Nous avons essayé de déplacer le code multipart vers commons-codec il y a quelques années. il y a quelques années, mais je n'ai pas décollé là-bas. Oleg a récemment mentionné un autre projet qui a un code d'analyse syntaxique multipart et qui pourrait être intéressé par notre code de formatage multipart. Je ne connais pas le statut actuel sur ce sujet. ( http://www.nabble.com/multipart-form-data-in-4.0-td14224819.html )

Quelqu'un connaît-il une bibliothèque Java qui me permet d'écrire un client HTTP capable d'effectuer une requête POST multipart/form-data ?

Le contexte : Je veux utiliser le API à distance de Zoho Writer .

4voto

Johan Points 1120

Vous pouvez également utiliser REST Assuré qui s'appuie sur HTTP Client. C'est très simple :

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

2voto

Bob Yoplait Points 1186

httpcomponents-client-4.0.1 a fonctionné pour moi. Cependant, j'ai dû ajouter le jar externe apache-mime4j-0.6.jar ( org.apache.james.mime4j ) sinon reqEntity.addPart("bin", bin); ne compilait pas. Maintenant ça marche comme sur des roulettes.

2voto

Amber Points 1836

J'ai trouvé cet échantillon dans l'application Apache Guide de démarrage rapide . C'est pour la version 4.5 :

/**
 * Example how to use multipart/form encoded POST request.
 */
public class ClientMultipartFormPost {

    public static void main(String[] 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]));
            StringBody comment = new StringBody("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();
        }
    }
}

0voto

atulsm Points 462

Nous avons une implémentation purement java de la soumission de formulaires multipartites sans utiliser de dépendances externes ou de bibliothèques en dehors de jdk. Voir https://github.com/atulsm/https-multipart-purejava/blob/master/src/main/java/com/atul/MultipartPure.java

private static String body = "{\"key1\":\"val1\", \"key2\":\"val2\"}";
private static String subdata1 = "@@ -2,3 +2,4 @@\r\n";
private static String subdata2 = "<data>subdata2</data>";

public static void main(String[] args) throws Exception{        
    String url = "https://" + ip + ":" + port + "/dataupload";
    String token = "Basic "+ Base64.getEncoder().encodeToString((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<String> response = multipart.finish();         
    for (String line : response) {
        System.out.println(line);
    }
}

0voto

Martin521Wang Points 35

Mon code envoie un fichier multipart au serveur.

  public static HttpResponse doPost(
    String host,
    String path,
    String method,
    MultipartFile multipartFile
  ) throws IOException
  {

    HttpClient httpClient = wrapClient(host);
    HttpPost httpPost = new HttpPost(buildUrl(host, path));

    if (multipartFile != null) {

      HttpEntity httpEntity;

      ContentBody contentBody;
      contentBody = new ByteArrayBody(multipartFile.getBytes(), multipartFile.getOriginalFilename());
      httpEntity = MultipartEntityBuilder.create()
                                         .addPart("nameOfMultipartFile", contentBody)
                                         .build();

      httpPost.setEntity(httpEntity);

    }
    return httpClient.execute(httpPost);
  }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X