Apache HttpClient - Tải lên nhiều phần
Sử dụng HttpClient, chúng tôi có thể thực hiện tải lên Multipart, tức là chúng tôi có thể tải lên các đối tượng lớn hơn ở các phần nhỏ hơn. Trong chương này, chúng tôi chứng minh tải lên nhiều phần trong ứng dụng khách HTTP bằng cách tải lên một tệp văn bản đơn giản.
Nói chung, bất kỳ tải lên nhiều phần nào đều chứa ba phần.
Bắt đầu tải lên
Tải lên các bộ phận của đối tượng
Hoàn thành tải lên Multipart
Để tải lên nhiều phần bằng HttpClient, chúng ta cần làm theo các bước sau:
Tạo một trình tạo nhiều phần.
Thêm các bộ phận mong muốn vào nó.
Hoàn thành quá trình xây dựng và lấy HttpEntity nhiều phần.
Xây dựng yêu cầu bằng cách đặt thực thể muti-part ở trên.
Thực hiện yêu cầu.
Sau đây là các bước để tải lên thực thể nhiều phần bằng thư viện HttpClient.
Bước 1 - Tạo một đối tượng HttpClient
Các createDefault() phương pháp của HttpClients lớp trả về một đối tượng của lớp CloseableHttpClient, là triển khai cơ bản của giao diện HttpClient. Sử dụng phương pháp này, tạo một đối tượng HttpClient -
//Creating CloseableHttpClient object
CloseableHttpClient httpclient = HttpClients.createDefault();
Bước 2 - Tạo một đối tượng FileBody
FileBodylớp đại diện cho phần nội dung nhị phân được hỗ trợ bởi một tệp. Khởi tạo lớp này bằng cách chuyển mộtFile đối tượng và một ContentType đối tượng đại diện cho loại nội dung.
//Creating a File object
File file = new File("sample.txt");
//Creating the FileBody object
FileBody filebody = new FileBody(file, ContentType.DEFAULT_BINARY);
Bước 3 - Tạo MultipartEntityBuilder
Các MultipartEntityBuilder lớp được sử dụng để xây dựng nhiều phần HttpEntityvật. Tạo đối tượng của nó bằng cách sử dụngcreate() phương thức (của cùng một lớp).
//Creating the MultipartEntityBuilder
MultipartEntityBuilder entitybuilder = MultipartEntityBuilder.create();
Bước 4 - Đặt chế độ
A MultipartEntityBuildercó ba chế độ: STRICT, RFC6532 và BROWSER_COMPATIBLE. Đặt nó ở chế độ mong muốn bằng cách sử dụngsetMode() phương pháp.
//Setting the mode
entitybuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
Bước 5 - Thêm nhiều phần khác nhau mong muốn
Sử dụng các phương pháp addTextBody(), addPart () và, addBinaryBody(), bạn có thể thêm văn bản, tệp, luồng và các đối tượng đơn giản khác vào MultipartBuilder. Thêm nội dung mong muốn bằng các phương pháp này.
//Adding text
entitybuilder.addTextBody("sample_text", "This is the text part of our file");
//Adding a file
entitybuilder.addBinaryBody("image", new File("logo.png"));
Bước 6 - Xây dựng thực thể đơn lẻ
Bạn có thể xây dựng tất cả các phần này thành một thực thể duy nhất bằng cách sử dụng build() phương pháp của MultipartEntityBuilderlớp học. Sử dụng phương pháp này, xây dựng tất cả các phần thành mộtHttpEntity.
//Building a single entity using the parts
HttpEntity mutiPartHttpEntity = entityBuilder.build();
Bước 7 - Tạo một đối tượng RequestBuilder
Lớp RequestBuilderđược sử dụng để xây dựng yêu cầu bằng cách thêm các tham số vào nó. Nếu yêu cầu thuộc loại PUT hoặc POST, nó sẽ thêm các tham số vào yêu cầu dưới dạng thực thể được mã hóa URL.
Tạo một đối tượng RequestBuilder (thuộc loại POST) bằng cách sử dụng post()phương pháp. Và chuyển Uri mà bạn muốn gửi yêu cầu nó làm tham số.
//Building the post request object
RequestBuilder reqbuilder = RequestBuilder.post("http://httpbin.org/post");
Bước 8 - Đặt đối tượng thực thể thành RequestBuilder
Đặt thực thể nhiều phần đã tạo ở trên thành RequestBuilder bằng cách sử dụng setEntity() phương pháp của RequestBuilder lớp học.
//Setting the entity object to the RequestBuilder
reqbuilder.setEntity(mutiPartHttpEntity);
Bước 9 - Xây dựng HttpUriRequest
Xây dựng một HttpUriRequest yêu cầu đối tượng bằng cách sử dụng build() phương pháp của RequestBuilder lớp học.
//Building the request
HttpUriRequest multipartRequest = reqbuilder.build();
Bước 10 - Thực hiện yêu cầu
Sử dụng execute() , thực hiện yêu cầu được xây dựng ở bước trước (bỏ qua yêu cầu làm tham số cho phương thức này).
//Executing the request
HttpResponse httpresponse = httpclient.execute(multipartRequest);
Thí dụ
Ví dụ sau minh họa cách gửi yêu cầu nhiều phần bằng thư viện HttpClient. Trong ví dụ này, chúng tôi đang cố gắng gửi một yêu cầu nhiều phần được hỗ trợ bởi một tệp.
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
public class MultipartUploadExample {
public static void main(String args[]) throws Exception{
//Creating CloseableHttpClient object
CloseableHttpClient httpclient = HttpClients.createDefault();
//Creating a file object
File file = new File("sample.txt");
//Creating the FileBody object
FileBody filebody = new FileBody(file, ContentType.DEFAULT_BINARY);
//Creating the MultipartEntityBuilder
MultipartEntityBuilder entitybuilder = MultipartEntityBuilder.create();
//Setting the mode
entitybuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
//Adding text
entitybuilder.addTextBody("sample_text", "This is the text part of our file");
//Adding a file
entitybuilder.addBinaryBody("image", new File("logo.png"));
//Building a single entity using the parts
HttpEntity mutiPartHttpEntity = entitybuilder.build();
//Building the RequestBuilder request object
RequestBuilder reqbuilder = RequestBuilder.post("http://httpbin.org/post");
//Set the entity object to the RequestBuilder
reqbuilder.setEntity(mutiPartHttpEntity);
//Building the request
HttpUriRequest multipartRequest = reqbuilder.build();
//Executing the request
HttpResponse httpresponse = httpclient.execute(multipartRequest);
//Printing the status and the contents of the response
System.out.println(EntityUtils.toString(httpresponse.getEntity()));
System.out.println(httpresponse.getStatusLine());
}
}
Đầu ra
Khi thực thi, chương trình trên tạo ra kết quả sau:
{
"args": {},
"data": "",
"files": {
"image": "data:application/octets66PohrH3IWNk1FzpohfdXPIfv9X3490FGcuXsHn9X0piCwomF/xdgADZ9GsfSyvLYAAAAAE
lFTkSuQmCC"
},
"form": {
"sample_text": "This is the text part of our file"
},
"headers": {
"Accept-Encoding": "gzip,deflate",
"Connection": "close",
"Content-Length": "11104",
"Content-Type": "multipart/form-data;
boundary=UFJbPHT7mTwpVq70LpZgCi5I2nvxd1g-I8Rt",
"Host": "httpbin.org",
"User-Agent": "Apache-HttpClient/4.5.6 (Java/1.8.0_91)"
},
"json": null,
"origin": "117.216.245.180",
"url": "http://httpbin.org/post"
}
HTTP/1.1 200 OK