83 votes

Apache HttpClient réalise une publication de formulaire multipart.

Je suis assez novice dans HttpClient et je trouve le manque (ou l'absence flagrante) de documentation extrêmement frustrant. J'essaie de mettre en œuvre la publication suivante (listée ci-dessous) avec Apache Http Client, mais je n'ai aucune idée de comment le faire en réalité. Je vais me plonger dans la documentation pour la prochaine semaine, mais peut-être que des codeurs HttpClient plus expérimentés pourraient me donner une réponse plus rapidement.

Post :

Type de contenu: multipart/form-data; boundary=---------------------------1294919323195
Longueur du contenu : 502
-----------------------------1294919323195
Disposition du contenu: form-data; name="number"

5555555555
-----------------------------1294919323195
Disposition du contenu: form-data; name="clip"

rickroll
-----------------------------1294919323195
Disposition du contenu: form-data; name="upload_file"; filename=""
Type de contenu : application/octet-stream

-----------------------------1294919323195
Disposition du contenu: form-data; name="tos"

accepter
-----------------------------1294919323195--

3 votes

Merci d'avoir posé ce genre de question directement liée au débogage d'application web... J'ai trouvé cela dans Firebug et jusqu'à présent je ne savais pas comment écrire une requête pour l'émuler!

116voto

mtomy Points 495

Utilisez MultipartEntityBuilder de la bibliothèque HttpMime pour effectuer la requête que vous souhaitez.

Dans mon projet, je fais cela de cette manière :

HttpEntity entity = MultipartEntityBuilder
    .create()
    .addTextBody("number", "5555555555")
    .addTextBody("clip", "rickroll")
    .addBinaryBody("upload_file", new File(filePath), ContentType.APPLICATION_OCTET_STREAM, "filename")
    .addTextBody("tos", "agree")
    .build();

HttpPost httpPost = new HttpPost("http://some-web-site");
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost);
HttpEntity result = response.getEntity();

En espérant que cela vous aidera.

(J'ai mis à jour ce post pour utiliser MultipartEntityBuilder au lieu de MultipartEntity obsolète, en utilisant le code de @mtomy comme exemple)

4 votes

MultipartEntity apparaît maintenant comme obsolète. J'utilise apache httpclient 4.3.3 - est-ce que quelqu'un sait ce que nous sommes censés utiliser à la place? Je trouve les résultats des recherches Google tellement pleins d'exemples de MultipartEntity que je ne trouve rien.

13 votes

Utilisez MultipartEntityBuilder. Exemple court: HttpEntity entity = MultipartEntityBuilder.create().addTextBody("field1", "valeur1").addBinaryBody("myfile", new File("/path/file1.txt"), ContentType.create("application/octet-stream"), "file1.txt").build();

0 votes

Please expand your answer to include how to set httpClient

20voto

Li Ying Points 111

MultipartEntity est maintenant signalé comme obsolète. J'utilise apache httpclient 4.3.3 - est-ce que quelqu'un sait ce que nous sommes censés utiliser à la place? Je trouve que les recherches sur Google sont tellement pleines d'exemples de MultipartEntity que je ne trouve rien. – vextorspace 31 Mar 2014 à 20h36

Voici un exemple de code dans HttpClient 4.3.x

http://hc.apache.org/httpcomponents-client-4.3.x/httpmime/examples/org/apache/http/examples/entity/mime/ClientMultipartFormPost.java

import org.apache.http.entity.mime.MultipartEntityBuilder;

HttpPost httppost = new HttpPost("http://localhost:8080" +
        "/servlets-examples/servlet/RequestInfoExample");

FileBody bin = new FileBody(new File(args[0]));
StringBody comment = new StringBody("Un fichier binaire d'un certain type", ContentType.TEXT_PLAIN);

HttpEntity reqEntity = MultipartEntityBuilder.create()
        .addPart("bin", bin)
        .addPart("comment", comment)
        .build();

httppost.setEntity(reqEntity);

Pour utiliser la classe MultipartEntityBuilder, vous avez besoin de httpmime, qui est un sous-projet de HttpClient

HttpClient 4.3.x:

http://hc.apache.org/httpcomponents-client-4.3.x/index.html

httpmime 4.3.x:

http://hc.apache.org/httpcomponents-client-4.3.x/httpmime/dependency-info.html

2voto

Alps1992 Points 1

Si vous utilisez le package org.apache.commons.httpclient.HttpClient, cela pourrait vous aider !

    HttpConnectionManager httpConnectionManager = new MultiThreadedHttpConnectionManager();
    //ici devrait définir HttpConnectionManagerParams mais ce n'est pas important pour vous
    HttpClient httpClient = new HttpClient(httpConnectionManager);

    PostMethod postMethod = new PostMethod("http://localhost/media");

    FilePart filePart = new FilePart("file", new File(filepath));
    StringPart typePart = new StringPart("type", fileContent.getType(), "utf-8");
    StringPart fileNamePart = new StringPart("fileName", fileContent.getFileName(), "utf-8");
    StringPart timestampPart = new StringPart("timestamp", ""+fileContent.getTimestamp(),"utf-8");
    Part[] parts = { typePart, fileNamePart, timestampPart, filePart };

    MultipartRequestEntity multipartRequestEntity = new MultipartRequestEntity(parts, postMethod.getParams());
    postMethod.setRequestEntity(multipartRequestEntity);
    httpClient.executeMethod(postMethod);
    String responseStr = postMethod.getResponseBodyAsString();

0voto

php html Points 478

Voici un extrait qui montre comment utiliser la méthode post avec des paramètres dans httpclient 4.

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