Muat naik pelbagai bahagian dengan HttpClient 4

1. Gambaran keseluruhan

Dalam tutorial ini, kami akan menerangkan bagaimana melakukan operasi muat naik pelbagai bahagian menggunakan HttpClient 4 .

Kami akan menggunakan //echo.200please.com sebagai pelayan ujian kerana ia bersifat umum dan menerima kebanyakan jenis kandungan.

Sekiranya anda ingin menggali lebih mendalam dan mengetahui perkara menarik lain yang boleh anda lakukan dengan HttpClient - teruskan ke tutorial utama HttpClient.

2. Menggunakan AddPart Menghubungi

Mari mulakan dengan melihat objek MultipartEntityBuilder untuk menambah bahagian ke entiti Http yang kemudian akan dimuat naik melalui operasi POST.

Ini adalah kaedah generik untuk menambahkan bahagian ke HttpEntity yang mewakili borang.

Contoh 2.1. - Memuat naik Borang dengan Dua Bahagian Teks dan Fail

File file = new File(textFileName); HttpPost post = new HttpPost("//echo.200please.com"); FileBody fileBody = new FileBody(file, ContentType.DEFAULT_BINARY); StringBody stringBody1 = new StringBody("Message 1", ContentType.MULTIPART_FORM_DATA); StringBody stringBody2 = new StringBody("Message 2", ContentType.MULTIPART_FORM_DATA); // MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addPart("upfile", fileBody); builder.addPart("text1", stringBody1); builder.addPart("text2", stringBody2); HttpEntity entity = builder.build(); // post.setEntity(entity); HttpResponse response = client.execute(post);

Perhatikan bahawa kami membuat instalasi objek File dengan juga menentukan nilai ContentType yang akan digunakan oleh pelayan.

Juga, perhatikan bahawa kaedah addPart mempunyai dua argumen, yang bertindak seperti pasangan kunci / nilai untuk borang. Ini hanya relevan jika pihak pelayan benar-benar mengharapkan dan menggunakan nama parameter - jika tidak, mereka hanya akan diabaikan.

3. Menggunakan addBinaryBody dan addTextBody Kaedah

Cara yang lebih langsung untuk membuat entiti berbilang bahagian adalah dengan menggunakan kaedah addBinaryBody dan AddTextBody . Kaedah ini berfungsi untuk memuat naik teks, fail, susunan watak, dan objek InputStream . Mari kita gambarkan bagaimana dengan contoh mudah.

Contoh 3.1. - Memuat naik Teks dan Bahagian Fail Teks

HttpPost post = new HttpPost("//echo.200please.com"); File file = new File(textFileName); String message = "This is a multipart post"; MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody("upfile", file, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody("text", message, ContentType.DEFAULT_BINARY); // HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);

Perhatikan bahawa FileBody dan StringBody objek tidak diperlukan di sini.

Juga penting, kebanyakan pelayan tidak memeriksa ContentType pada isi teks, jadi kaedah addTextBody mungkin menghilangkan nilai ContentType .

The addBinaryBody API menerima suatu contenttype - tetapi ia juga mungkin untuk mewujudkan entiti hanya dari badan binari dan nama borang di parameter memegang fail. Seperti yang dinyatakan di bahagian sebelumnya, beberapa pelayan tidak akan mengenali fail tersebut jika nilai ContentType tidak ditentukan.

Seterusnya, kami akan menambahkan fail zip sebagai InputStream, sementara fail gambar akan ditambahkan sebagai objek Fail :

Contoh 3.2. - Memuat naik aFail Zip, Fail Gambar, dan Bahagian Teks

HttpPost post = new HttpPost("//echo.200please.com"); InputStream inputStream = new FileInputStream(zipFileName); File file = new File(imageFileName); String message = "This is a multipart post"; MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody ("upfile", file, ContentType.DEFAULT_BINARY, imageFileName); builder.addBinaryBody ("upstream", inputStream, ContentType.create("application/zip"), zipFileName); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); // HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);

Perhatikan bahawa nilai ContentType dapat dibuat dengan cepat, seperti dalam contoh di atas untuk fail zip.

Akhirnya, tidak semua pelayan mengakui bahagian InputStream . Pelayan yang kami buat pada baris pertama kod mengenali InputStream s.

Sekarang mari kita lihat contoh lain di mana addBinaryBody berfungsi secara langsung dengan tatasusunan bait:

Contoh 3.3. - Memuat naik Array dan Teks Byte

HttpPost post = new HttpPost("//echo.200please.com"); String message = "This is a multipart post"; byte[] bytes = "binary code".getBytes(); // MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody("upfile", bytes, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); // HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);

Perhatikan ContentType - yang kini menentukan data binari.

4. Kesimpulan

Artikel ini telah memperlihatkan MultipartEntityBuilder sebagai objek fleksibel yang menawarkan pelbagai pilihan API untuk membuat bentuk multipart.

Contohnya juga menunjukkan cara menggunakan HttpClient untuk memuat naik HttpEntity yang serupa dengan entiti borang.

Pelaksanaan semua contoh dan potongan kode ini terdapat di projek GitHub kami - ini adalah projek berasaskan Eclipse, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.