Menghantar dengan HttpClient

1. Gambaran keseluruhan

Dalam tutorial ini - kita akan POST dengan HttpClient 4 - menggunakan kebenaran pertama, kemudian HttpClient API yang fasih.

Akhirnya, kita akan membincangkan cara memuat naik fail menggunakan Httpclient.

2. POST Asas

Pertama, mari kita lihat contoh mudah dan hantarkan permintaan POST menggunakan HttpClient .

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

@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 memasukkan parameter dalam permintaan POST.

3. POST Dengan Kebenaran

Seterusnya, mari kita lihat bagaimana melakukan POST dengan kelayakan Pengesahan menggunakan HttpClient .

Dalam contoh berikut - kami menghantar permintaan POST ke URL yang diamankan dengan Pengesahan Asas dengan menambahkan tajuk Pengesahan:

@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. POST DENGAN JSON

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

Dalam contoh berikut - kami menghantar beberapa maklumat 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 kita menggunakan StringEntity untuk menetapkan isi permintaan.

Kami juga menetapkan tajuk ContentType ke aplikasi / json untuk memberikan maklumat yang diperlukan kepada pelayan mengenai perwakilan kandungan yang kami kirimkan .

5. POST Dengan API HttpClient Fluent

Seterusnya, mari kita POST dengan HttpClient Fluent API.

Kami akan mengirim permintaan dengan dua parameter " nama pengguna " dan " kata laluan ":

@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 kita Hantar Permintaan Multipart.

Kami akan menghantar Fail , nama pengguna, dan kata laluan 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. Muat Naik Fail Menggunakan HttpClient

Seterusnya, mari kita lihat cara memuat naik Fail menggunakan HttpClient.

Kami akan memuat naik fail " 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 Muat Naik Fail

Akhirnya - mari kita lihat bagaimana untuk mendapatkan kemajuan muat naik Fail menggunakan HttpClient .

Dalam contoh berikut, kami akan memperluas HttpEntityWrapper untuk mendapatkan keterlihatan dalam proses muat naik.

Pertama - inilah kaedah muat naik:

@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 antara muka ProgressListener yang membolehkan kami memerhatikan kemajuan muat naik:

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

Dan inilah versi lanjutan HttpEntityWrapper " ProgressEntityWrapper " kami:

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 lanjutan 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 bahawa:

  • Semasa memperluaskan FilterOutputStream ke " CountingOutputStream" - kami mengesampingkan kaedah tulis () untuk mengira bait yang ditulis (dipindahkan)
  • Semasa memperluaskan HttpEntityWrapper ke " ProgressEntityWrapper" - kami akan mengganti kaedah writeTo () untuk menggunakan "CountingOutputStream" kami

9. Kesimpulannya

Dalam tutorial ini, kami menggambarkan cara yang paling biasa untuk menghantar Permintaan HTTP POST dengan Apache HttpClient 4 .

Kami belajar bagaimana mengirim permintaan POST dengan Otorisasi , cara mengepos menggunakan HttpClient fasih API dan cara memuat naik fail dan melacak kemajuannya.

Pelaksanaan semua contoh dan potongan kod ini boleh didapati di projek github.