Apache HttpClient робить багаточасткову форму повідомлення


77

Я досить зелений щодо HttpClient, і мені здається, що відсутність (або відверто неправильна) документація надзвичайно неприємна. Я намагаюся реалізувати наступний пост (перерахований нижче) за допомогою клієнта Apache Http, але не маю уявлення, як насправді це зробити. Я збираюся поховати себе в документації на наступний тиждень, але, можливо, більш досвідчені кодери HttpClient можуть отримати мені відповідь раніше.

Допис:

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

3
Дякуємо за запитання такого типу, яке безпосередньо стосується налагодження веб-додатків ... Я знайшов це у Firebug і до цього часу не знав, як написати запит для його емуляції!

Відповіді:


105

Використовуйте MultipartEntityBuilder із бібліотеки HttpMime, щоб виконати потрібний запит.

У своєму проекті я роблю це так:

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

Сподіваюся, це допоможе.

(Оновлено цю публікацію для використання MultipartEntityBuilder замість застарілої MultipartEntity, використовуючи код @mtomy як приклад)


4
Тепер MultipartEntity відображається як застарілий. Я використовую apache httpclient 4.3.3 - хтось знає, що ми повинні використовувати замість цього? Я вважаю, що пошукові запити в Google настільки насичені прикладами MultipartEntity, що я нічого не можу знайти.
vextorspace

13
Використовуйте MultipartEntityBuilder. Короткий приклад: HttpEntity entity = MultipartEntityBuilder.create (). AddTextBody ("field1", "value1"). AddBinaryBody ("myfile", new File ("/ path / file1.txt"), ContentType.create ("application / octet -потік ")," file1.txt "). build ();
mtomy

Будь ласка, розширте свою відповідь, включивши, як встановитиhttpClient
8bitjunkie

Я використовую той самий приклад, але його метання
Сантош b

Я використовую той самий приклад, але його виняток завжди викидає java.net.SocketException: Зламана труба (запис не вдався)
Сантош b

15

Тепер MultipartEntity відображається як застарілий. Я використовую apache httpclient 4.3.3 - хтось знає, що ми повинні використовувати замість цього? Я вважаю, що пошукові запити в Google настільки наповнені прикладами MultipartEntity, що я нічого не можу знайти. - vextorspace 31 березня '14 о 20:36

Ось зразок коду в 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);

Щоб використовувати клас MultipartEntityBuilder, вам потрібен httpmime , який є підпроектом 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


2

якщо використовуєте пакет org.apache.commons.httpclient.HttpClient, можливо, це може вам допомогти!

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

це для HttpClient 3.x, а не для 4.x.
M2E67

не працював у мене, не можу вирішити MultiThreadedHttpConnectionManager
8bitjunkie
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.