Apache HttpClient macht mehrteiligen Formularbeitrag

77

Ich bin ziemlich grün für HttpClient und finde den Mangel an (und / oder offensichtlich falscher) Dokumentation äußerst frustrierend. Ich versuche, den folgenden Beitrag (unten aufgeführt) mit Apache Http Client zu implementieren, habe aber keine Ahnung, wie ich das tatsächlich tun soll. Ich werde mich für die nächste Woche in der Dokumentation vergraben, aber vielleicht könnten erfahrenere HttpClient-Codierer mir früher eine Antwort geben.

Post:

Content-Type: multipart/form-data; boundary=---------------------------1294919323195
Content-Length: 502
-----------------------------1294919323195
Content-Disposition: form-data; name="number"

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

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


-----------------------------1294919323195
Content-Disposition: form-data; name="tos"

agree
-----------------------------1294919323195--
Russ
quelle
3
Vielen Dank, dass Sie die Art von Frage gestellt haben, die in direktem Zusammenhang mit dem Debuggen von Web-Apps steht ... Ich habe diese in Firebug gefunden und wusste bis jetzt nicht, wie ich eine Abfrage schreiben soll, um sie zu emulieren!

Antworten:

105

Verwenden Sie MultipartEntityBuilder aus der HttpMime-Bibliothek , um die gewünschte Anforderung auszuführen.

In meinem Projekt mache ich das so:

HttpEntity entity = MultipartEntityBuilder
    .create()
    .addTextBody("number", "5555555555")
    .addTextBody("clip", "rickroll")
    .addBinaryBody("upload_file", new File(filePath), ContentType.create("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();

Hoffe das wird helfen.

(Dieser Beitrag wurde aktualisiert, um MultipartEntityBuilder anstelle von veraltetem MultipartEntity zu verwenden, wobei @mtomy-Code als Beispiel verwendet wird.)

mtomy
quelle
4
MultipartEntity wird jetzt als veraltet angezeigt. Ich verwende Apache httpclient 4.3.3 - weiß jemand, was wir stattdessen verwenden sollen? Ich finde, dass die Google-Suche so voll von MultipartEntity-Beispielen ist, dass ich nichts finden kann.
vextorspace
13
Verwenden Sie MultipartEntityBuilder. Kurzes Beispiel: HttpEntity entity = MultipartEntityBuilder.create (). AddTextBody ("field1", "value1"). AddBinaryBody ("myfile", neue Datei ("/ path / file1.txt"), ContentType.create ("application / octet") -stream ")," file1.txt "). build ();
Mtomy
Bitte erweitern Sie Ihre Antwort um das EinstellenhttpClient
8bitjunkie
Ich benutze das gleiche Beispiel, aber es wirft
Santosh b
Ich benutze das gleiche Beispiel, aber es löst diese Ausnahme immer java.net.SocketException: Broken Pipe (Schreiben fehlgeschlagen)
Santosh b
15

MultipartEntity wird jetzt als veraltet angezeigt. Ich verwende Apache httpclient 4.3.3 - weiß jemand, was wir stattdessen verwenden sollen? Ich finde, dass die Google-Suche so voll von MultipartEntity-Beispielen ist, dass ich nichts finden kann. - Vextorspace 31. März 14 um 20:36 Uhr

Hier ist der Beispielcode in 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("A binary file of some kind", ContentType.TEXT_PLAIN);

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


httppost.setEntity(reqEntity);

Um die Klasse MultipartEntityBuilder verwenden zu können, benötigen Sie httpmime , ein Unterprojekt von 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

Li Ying
quelle
2

Wenn Sie das Paket org.apache.commons.httpclient.HttpClient verwenden, kann Ihnen das vielleicht helfen!

    HttpConnectionManager httpConnectionManager = new MultiThreadedHttpConnectionManager();
    //here should set HttpConnectionManagerParams but not important for you
    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();
Alpen1992
quelle
Es ist für HttpClient 3.x nicht für 4.x.
M2E67
hat bei mir nicht funktioniert, kann MultiThreadedHttpConnectionManager
8bitjunkie