Objavljivanje putem HttpClienta

1. Pregled

U ovom vodiču - OBJAVIT ćemo s HttpClient 4 - koristeći prvo odobrenje, a zatim fluidni HttpClient API.

Na kraju ćemo razgovarati o tome kako prenijeti datoteku pomoću Httpclienta.

2. Osnovni POST

Prvo, pređimo na jednostavan primjer i pošaljite POST zahtjev pomoću HttpClient.

Napravit ćemo POST s dva parametra - “Korisničko ime"I"zaporka“:

@Test public void whenSendPostRequestUsingHttpClient_thenCorrect () baca ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = novi HttpPost ("// www.example.com"); Parametri popisa = new ArrayList (); params.add (novi BasicNameValuePair ("korisničko ime", "Ivan")); params.add (novi BasicNameValuePair ("lozinka", "prolazak")); httpPost.setEntity (novi UrlEncodedFormEntity (parametri)); CloseableHttpResponse odgovor = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), jednakTo (200)); client.close (); }

Primijetite kako smo koristili a Popis od NameValuePair uključiti parametre u POST zahtjev.

3. POŠTA S autorizacijom

Dalje, pogledajmo kako napraviti POST s vjerodajnicama za provjeru autentičnosti pomoću HttpClient.

U sljedećem primjeru - šaljemo POST zahtjev na URL zaštićen osnovnom autentifikacijom dodavanjem zaglavlja autorizacije:

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

4. OBJAVI SA JSON-om

Sada - da vidimo kako poslati POST zahtjev s JSON tijelom pomoću HttpClient.

U sljedećem primjeru - šaljemo neke osoba informacije (id, ime) kao JSON:

@Test public void whenPostJsonUsingHttpClient_thenCorrect () baca ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = novi HttpPost ("// www.example.com"); Niz json = "{" id ": 1," name ":" John "}"; StringEntity entitet = novi StringEntity (json); httpPost.setEntity (entitet); httpPost.setHeader ("Prihvati", "aplikacija / json"); httpPost.setHeader ("Content-type", "application / json"); CloseableHttpResponse odgovor = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), jednakTo (200)); client.close (); }

Primijetite kako koristimo StringEntity za postavljanje tijela zahtjeva.

Također postavljamo ContentType zaglavlje do aplikacija / jsonkako bismo poslužitelju dali potrebne informacije o zastupljenosti sadržaja koji šaljemo.

5. OBJAVI S API protokola HttpClient Fluent

Dalje, POSTAVLJAMO s HttpClient Tečni API.

Poslat ćemo zahtjev s dva parametra “Korisničko ime"I"zaporka“:

@Test public void whenPostFormUsingHttpClientFluentAPI_thenCorrect () baca ClientProtocolException, IOException {HttpResponse response = Request.Post ("// www.example.com"). BodyForm (Form.form (). Add ("username", "John"). ("lozinka", "prolazak"). build ()) .execute (). returnResponse (); assertThat (response.getStatusLine (). getStatusCode (), jednakTo (200)); }

6. POŠALJI višedijelni zahtjev

Pošaljite sada višedijelni zahtjev.

Poslat ćemo a Datoteka, korisničko ime i lozinku MultipartEntityBuilder:

@Test public void whenSendMultipartRequestUsingHttpClient_thenCorrect () baca ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = novi HttpPost ("// www.example.com"); Graditelj MultipartEntityBuilder = MultipartEntityBuilder.create (); builder.addTextBody ("korisničko ime", "John"); builder.addTextBody ("lozinka", "prolazak"); builder.addBinaryBody ("datoteka", nova datoteka ("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "datoteka.ext"); HttpEntity multipart = builder.build (); httpPost.setEntity (više dijelova); CloseableHttpResponse odgovor = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), jednakTo (200)); client.close (); }

7. Prenesite a Datoteka Koristeći HttpClient

Dalje, pogledajmo kako prenijeti Datoteka koristiti HttpClient.

Prenijet ćemo "test.txt"Datoteka pomoću MultipartEntityBuilder:

@Test public void whenUploadFileUsingHttpClient_thenCorrect () baca ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = novi HttpPost ("// www.example.com"); Graditelj MultipartEntityBuilder = MultipartEntityBuilder.create (); builder.addBinaryBody ("datoteka", nova datoteka ("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "datoteka.ext"); HttpEntity multipart = builder.build (); httpPost.setEntity (više dijelova); CloseableHttpResponse odgovor = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), jednakTo (200)); client.close (); }

8. Nabavite Datoteka UčitajNapredak

Napokon - pogledajmo kako postići napredak Datoteka upload pomoću HttpClient.

U sljedećem ćemo primjeru proširiti HttpEntityWrapper radi vidljivosti postupka prijenosa.

Prvo - evo načina prijenosa:

@Test public void whenGetUploadFileProgressUsingHttpClient_thenCorrect () baca ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = novi HttpPost ("// www.example.com"); Graditelj MultipartEntityBuilder = MultipartEntityBuilder.create (); builder.addBinaryBody ("datoteka", nova datoteka ("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "datoteka.ext"); HttpEntity multipart = builder.build (); ProgressEntityWrapper.ProgressListener pListener = postotak -> assertFalse (Float.compare (postotak, 100)> 0); httpPost.setEntity (novi ProgressEntityWrapper (više dijelova, pListener)); CloseableHttpResponse odgovor = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), jednakTo (200)); client.close (); }

Također ćemo dodati sučelje ProgressListener koji nam omogućuje praćenje napretka prijenosa:

javno statično sučelje ProgressListener {void progress (plutajući postotak); }

I evo naše proširene verzije HttpEntityWrapper ProgressEntityWrapper“:

javna klasa ProgressEntityWrapper proširuje HttpEntityWrapper {privatni slušatelj ProgressListener; javni ProgressEntityWrapper (entitet HttpEntity, slušatelj ProgressListener) {super (entitet); this.listener = slušatelj; } @Override public void writeTo (OutputStream outstream) baca IOException {super.writeTo (new CountingOutputStream (outstream, listener, getContentLength ())); }} 

I proširena verzija FilterOutputStreamCountingOutputStream“:

javna statička klasa CountingOutputStream proširuje FilterOutputStream {private ProgressListener listener; privatno davno preneseno; privatni dugi ukupni bajtovi; javni CountingOutputStream (OutputStream out, preslušač ProgressListener, long totalBytes) {super (out); this.listener = slušatelj; preneseno = 0; this.totalBytes = totalBytes; } @Override public void write (byte [] b, int off, int len) baca IOException {out.write (b, off, len); preneseno + = len; listener.progress (getCurrentProgress ()); } @Override public void write (int b) baca IOException {out.write (b); preneseno ++; listener.progress (getCurrentProgress ()); } private float getCurrentProgress () {return ((float) transfer / totalBytes) * 100; }}

Imajte na umu da:

  • Prilikom produženja FilterOutputStream do "CountingOutputStream ”- mi nadjačavamo pisati() metoda za brojanje zapisanih (prenesenih) bajtova
  • Prilikom produženja HttpEntityWrapper do "ProgressEntityWrapper ”- mi nadjačavamo writeTo () metoda za korištenje našeg "CountingOutputStream"

9. Zaključak

U ovom smo uputstvu ilustrirali najčešće načine slanja POST HTTP zahtjeva s Apache HttpClient 4.

Naučili smo kako poslati POST zahtjev s autorizacijom, kako objavljivati ​​pomoću HttpClient tečni API i kako prenijeti datoteku i pratiti njezin napredak.

Implementacija svih ovih primjera i isječaka koda može se naći u projektu github.