Memposting dengan HttpClient

1. Ikhtisar

Dalam tutorial ini - kita akan POST dengan HttpClient 4 - menggunakan otorisasi pertama, lalu HttpClient API yang lancar.

Terakhir, kita akan membahas cara Mengunggah File Menggunakan Httpclient.

2. POST Dasar

Pertama, mari kita lihat contoh sederhana dan mengirim permintaan POST menggunakan HttpClient .

Kami akan melakukan POST dengan dua parameter - " nama pengguna " dan " kata sandi ":

@Test public void whenSendPostRequestUsingHttpClient_thenCorrect() throws ClientProtocolException, IOException { CloseableHttpClient client = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("//www.example.com"); List params = new ArrayList(); params.add(new BasicNameValuePair("username", "John")); params.add(new BasicNameValuePair("password", "pass")); httpPost.setEntity(new UrlEncodedFormEntity(params)); CloseableHttpResponse response = client.execute(httpPost); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); client.close(); }

Perhatikan bagaimana kami menggunakan List of NameValuePair untuk menyertakan parameter dalam permintaan POST.

3. POST Dengan Otorisasi

Selanjutnya, mari kita lihat bagaimana melakukan POST dengan kredensial Otentikasi menggunakan HttpClient .

Dalam contoh berikut - kami mengirim permintaan POST ke URL yang diamankan dengan Autentikasi Dasar dengan menambahkan header Otorisasi:

@Test public void whenSendPostRequestWithAuthorizationUsingHttpClient_thenCorrect() throws ClientProtocolException, IOException, AuthenticationException { CloseableHttpClient client = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("//www.example.com"); httpPost.setEntity(new StringEntity("test post")); UsernamePasswordCredentials creds = new UsernamePasswordCredentials("John", "pass"); httpPost.addHeader(new BasicScheme().authenticate(creds, httpPost, null)); CloseableHttpResponse response = client.execute(httpPost); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); client.close(); }

4. POSTING Dengan JSON

Sekarang - mari kita lihat cara mengirim permintaan POST dengan badan JSON menggunakan HttpClient .

Dalam contoh berikut - kami mengirimkan beberapa informasi orang ( id, nama ) sebagai JSON:

@Test public void whenPostJsonUsingHttpClient_thenCorrect() throws ClientProtocolException, IOException { CloseableHttpClient client = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("//www.example.com"); String json = "{"id":1,"name":"John"}"; StringEntity entity = new StringEntity(json); httpPost.setEntity(entity); httpPost.setHeader("Accept", "application/json"); httpPost.setHeader("Content-type", "application/json"); CloseableHttpResponse response = client.execute(httpPost); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); client.close(); }

Perhatikan bagaimana kami menggunakan StringEntity untuk mengatur isi permintaan.

Kami juga menyetel header ContentType ke application / json untuk memberi server informasi yang diperlukan tentang representasi konten yang kami kirim.

5. POSTING Dengan API HttpClient Fluent

Selanjutnya, mari POST dengan HttpClient Fluent API.

Kami akan mengirimkan permintaan dengan dua parameter " username " dan " password ":

@Test public void whenPostFormUsingHttpClientFluentAPI_thenCorrect() throws ClientProtocolException, IOException { HttpResponse response = Request.Post("//www.example.com").bodyForm( Form.form().add("username", "John").add("password", "pass").build()) .execute().returnResponse(); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); }

6. Permintaan Multipart POST

Sekarang, mari POST Permintaan Multipart.

Kami akan memposting File , nama pengguna, dan kata sandi menggunakan MultipartEntityBuilder :

@Test public void whenSendMultipartRequestUsingHttpClient_thenCorrect() throws ClientProtocolException, IOException { CloseableHttpClient client = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("//www.example.com"); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addTextBody("username", "John"); builder.addTextBody("password", "pass"); builder.addBinaryBody( "file", new File("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "file.ext"); HttpEntity multipart = builder.build(); httpPost.setEntity(multipart); CloseableHttpResponse response = client.execute(httpPost); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); client.close(); }

7. Unggah File Menggunakan HttpClient

Selanjutnya, mari kita lihat cara mengunggah File menggunakan HttpClient.

Kami akan mengupload file " test.txt " menggunakan MultipartEntityBuilder :

@Test public void whenUploadFileUsingHttpClient_thenCorrect() throws ClientProtocolException, IOException { CloseableHttpClient client = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("//www.example.com"); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addBinaryBody( "file", new File("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "file.ext"); HttpEntity multipart = builder.build(); httpPost.setEntity(multipart); CloseableHttpResponse response = client.execute(httpPost); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); client.close(); }

8. Dapatkan Kemajuan Upload File

Terakhir - mari kita lihat bagaimana cara mendapatkan kemajuan unggahan File menggunakan HttpClient .

Dalam contoh berikut, kami akan memperluas HttpEntityWrapper untuk mendapatkan visibilitas ke dalam proses pengunggahan.

Pertama - inilah metode unggah:

@Test public void whenGetUploadFileProgressUsingHttpClient_thenCorrect() throws ClientProtocolException, IOException { CloseableHttpClient client = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("//www.example.com"); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addBinaryBody( "file", new File("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "file.ext"); HttpEntity multipart = builder.build(); ProgressEntityWrapper.ProgressListener pListener = percentage -> assertFalse(Float.compare(percentage, 100) > 0); httpPost.setEntity(new ProgressEntityWrapper(multipart, pListener)); CloseableHttpResponse response = client.execute(httpPost); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); client.close(); }

Kami juga akan menambahkan antarmuka ProgressListener yang memungkinkan kami mengamati kemajuan unggahan:

public static interface ProgressListener { void progress(float percentage); }

Dan inilah versi tambahan dari HttpEntityWrapperProgressEntityWrapper “:

public class ProgressEntityWrapper extends HttpEntityWrapper { private ProgressListener listener; public ProgressEntityWrapper(HttpEntity entity, ProgressListener listener) { super(entity); this.listener = listener; } @Override public void writeTo(OutputStream outstream) throws IOException { super.writeTo(new CountingOutputStream(outstream, listener, getContentLength())); } } 

Dan versi tambahan FilterOutputStream " CountingOutputStream ":

public static class CountingOutputStream extends FilterOutputStream { private ProgressListener listener; private long transferred; private long totalBytes; public CountingOutputStream( OutputStream out, ProgressListener listener, long totalBytes) { super(out); this.listener = listener; transferred = 0; this.totalBytes = totalBytes; } @Override public void write(byte[] b, int off, int len) throws IOException { out.write(b, off, len); transferred += len; listener.progress(getCurrentProgress()); } @Override public void write(int b) throws IOException { out.write(b); transferred++; listener.progress(getCurrentProgress()); } private float getCurrentProgress() { return ((float) transferred / totalBytes) * 100; } }

Perhatikan bahwa:

  • Saat memperluas FilterOutputStream ke " CountingOutputStream" - kami mengganti metode write () untuk menghitung byte tertulis (ditransfer)
  • Saat memperluas HttpEntityWrapper ke " ProgressEntityWrapper" - kami mengganti metode writeTo () untuk menggunakan "CountingOutputStream"

9. Kesimpulan

Dalam tutorial ini, kami mengilustrasikan cara paling umum untuk mengirim Permintaan HTTP POST dengan Apache HttpClient 4 .

Kami belajar cara mengirim permintaan POST dengan Otorisasi, cara memposting menggunakan HttpClient fluent API dan cara mengunggah file dan melacak kemajuannya.

Penerapan semua contoh dan cuplikan kode ini dapat ditemukan di proyek github.