2010-02-21 29 views
52

Tôi khá xanh với HttpClient và tôi đang tìm thấy việc thiếu tài liệu (và hoặc không chính xác không chính xác) cực kỳ bực bội. Tôi đang cố gắng để thực hiện các bài sau đây (được liệt kê dưới đây) với Apache Http Client, nhưng không có ý tưởng làm thế nào để thực sự làm điều đó. Tôi sẽ chôn mình trong tài liệu cho tuần tới, nhưng có lẽ các lập trình viên có kinh nghiệm hơn HttpClient có thể giúp tôi trả lời sớm hơn.Apache HttpClient tạo biểu mẫu nhiều bài đăng

bài viết:

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

Cảm ơn bạn đã đặt câu hỏi liên quan trực tiếp đến gỡ lỗi ứng dụng web ... Tôi đã tìm thấy điều này trong Firebug và cho đến bây giờ không biết cách viết truy vấn để mô phỏng nó! –

Trả lời

75

Sử dụng MultipartEntityBuilder từ HttpMime library để thực hiện các yêu cầu mà bạn muốn.

Trong dự án của tôi, tôi làm điều đó theo cách này:

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

Hy vọng điều này sẽ giúp.

(Cập nhật bài này để sử dụng MultipartEntityBuilder thay vì phản đối MultipartEntity, sử dụng mã @mtomy như ví dụ)

+2

MultipartEntity hiện hiển thị không được chấp nhận. Tôi đang sử dụng apache httpclient 4.3.3 - có ai biết những gì chúng ta có nghĩa vụ phải sử dụng thay thế? Tôi tìm thấy các tìm kiếm google để được như vậy đầy đủ các ví dụ MultipartEntity tôi không thể tìm thấy bất cứ điều gì. – vextorspace

+11

Sử dụng MultipartEntityBuilder. Ví dụ ngắn: HttpEntity entity = MultipartEntityBuilder.create(). AddTextBody ("field1", "value1"). AddBinaryBody ("myfile", tệp mới ("/ path/file1.txt"), ContentType.create (" application/octet-stream ")," file1.txt "). xây dựng(); – mtomy

13

MultipartEntity nay xuất hiện như phản đối. Tôi đang sử dụng apache httpclient 4.3.3 - có ai biết những gì chúng tôi có nghĩa vụ phải sử dụng thay thế? Tôi thấy các tìm kiếm trên google có đầy đủ các ví dụ về MultipartEntity Tôi không thể tìm thấy bất kỳ thứ gì. - vextorspace 31 tháng 3 '14 tại 20:36

Đây là đoạn mã mẫu trong 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); 

Để sử dụng lớp MultipartEntityBuilder, bạn cần httpmime, là một dự án phụ của 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

nếu gói sử dụng org.apache.commons.httpclient.HttpClient, có lẽ có thể giúp bạn!

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

là dành cho HttpClient 3.x không dành cho 4.x. – M2E67

Các vấn đề liên quan