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 FilterOutputStream “CountingOutputStream“:
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.