Uverejňovanie pomocou HttpClient
1. Prehľad
V tomto návode - pošleme príspevok s HttpClient 4 - pomocou prvej autorizácie, potom plynulého rozhrania HttpClient API.
Na záver si povieme, ako nahrať súbor pomocou Httpclient.
2. Základný POST
Po prvé, poďme na jednoduchý príklad a pošleme požiadavku POST pomocou HttpClient.
Urobíme POST s dvoma parametrami - “používateľské meno“A„heslo“:
@Test public void whenSendPostRequestUsingHttpClient_thenCorrect () vyvolá ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = nový HttpPost ("// www.example.com"); Zoznam parametrov = new ArrayList (); params.add (new BasicNameValuePair ("používateľské meno", "John")); params.add (new BasicNameValuePair ("heslo", "heslo")); httpPost.setEntity (nový UrlEncodedFormEntity (parametre)); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }
Všimnite si, ako sme použili a Zoznam z NameValuePair zahrnúť parametre do požiadavky POST.
3. POST s autorizáciou
Ďalej sa pozrime, ako urobiť POST s overovacími povereniami pomocou HttpClient.
V nasledujúcom príklade - pošleme požiadavku POST na adresu URL zabezpečenú základným overením pridaním hlavičky Autorizácia:
@Test public void whenSendPostRequestWithAuthorizationUsingHttpClient_thenCorrect () hodí ClientProtocolException, IOException, AuthenticationException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = nový HttpPost ("// www.example.com"); httpPost.setEntity (nový StringEntity ("testovací príspevok")); UsernamePasswordCredentials creds = nové 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 S JSON
Teraz - pozrime sa, ako poslať požiadavku POST s telom JSON pomocou HttpClient.
V nasledujúcom príklade - niektoré posielame osoba informácie (id, meno) ako JSON:
@Test public void whenPostJsonUsingHttpClient_thenCorrect () vyvolá ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = nový HttpPost ("// www.example.com"); Reťazec json = "{" id ": 1," name ":" John "}"; StringEntity entity = new StringEntity (json); httpPost.setEntity (entita); httpPost.setHeader ("Prijať", "aplikácia / json"); httpPost.setHeader ("Content-type", "application / json"); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }
Všimnite si, ako používame StringEntity na nastavenie tela žiadosti.
Nastavujeme tiež Druh obsahu hlavička do aplikácia / jsonaby sme serveru poskytli potrebné informácie o zastúpení obsahu, ktorý odosielame.
5. POST pomocou HttpClient Fluent API
Ďalej POŠŤUJEME pomocou HttpClient Plynulé API.
Pošleme požiadavku s dvoma parametrami “používateľské meno“A„heslo“:
@Test public void whenPostFormUsingHttpClientFluentAPI_thenCorrect () vyvolá ClientProtocolException, IOException {HttpResponse response = Request.Post ("// www.example.com"). BodyForm (Form.form (). Add ("username", "John"). Add ("heslo", "prejsť"). build ()) .execute (). returnResponse (); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }
6. POST požiadavka na viac častí
Poďme teraz POŠTOVAŤ požiadavku na viac častí.
Zverejníme a Súbor, používateľské meno a heslo pomocou MultipartEntityBuilder:
@ Test public void whenSendMultipartRequestUsingHttpClient_thenCorrect () hodí ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = nový HttpPost ("// www.example.com"); MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.addTextBody ("používateľské meno", "John"); builder.addTextBody ("heslo", "heslo"); builder.addBinaryBody ("súbor", nový súbor ("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "súbor.ext"); HttpEntity multipart = builder.build (); httpPost.setEntity (viacdielne); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }
7. Odovzdajte a Súbor Použitím HttpClient
Ďalej sa pozrime, ako nahrať a Súbor pomocou HttpClient.
Nahráme „test.txt”Súbor pomocou MultipartEntityBuilder:
@ Test public void whenUploadFileUsingHttpClient_thenCorrect () vyvolá ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = nový HttpPost ("// www.example.com"); MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.addBinaryBody ("súbor", nový súbor ("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "súbor.ext"); HttpEntity multipart = builder.build (); httpPost.setEntity (viacdielne); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }
8. Získajte Súbor NahraťPokrok
Nakoniec - pozrime sa, ako dosiahnuť pokrok Súbor nahrať pomocou HttpClient.
V nasledujúcom príklade rozšírime HttpEntityWrapper na zviditeľnenie procesu nahrávania.
Najprv - tu je metóda nahrávania:
@ Test public void whenGetUploadFileProgressUsingHttpClient_thenCorrect () hodí ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = nový HttpPost ("// www.example.com"); MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.addBinaryBody ("súbor", nový súbor ("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "súbor.ext"); HttpEntity multipart = builder.build (); ProgressEntityWrapper.ProgressListener pListener = percento -> assertFalse (Float.compare (percento, 100)> 0); httpPost.setEntity (nový ProgressEntityWrapper (viacdielny, pListener)); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }
Pridáme aj rozhranie ProgressListener ktorý nám umožňuje sledovať priebeh nahrávania:
verejné statické rozhranie ProgressListener {void progress (float percent); }
A tu je naša rozšírená verzia aplikácie HttpEntityWrapper “ProgressEntityWrapper“:
verejná trieda ProgressEntityWrapper rozširuje HttpEntityWrapper {súkromný poslucháč ProgressListener; public ProgressEntityWrapper (entita HttpEntity, poslucháč ProgressListener) {super (entita); this.listener = poslucháč; } @Override public void writeTo (OutputStream outstream) hodí IOException {super.writeTo (new CountingOutputStream (outstream, listener, getContentLength ())); }}
A rozšírená verzia FilterOutputStream “CountingOutputStream“:
verejná statická trieda CountingOutputStream rozširuje FilterOutputStream {súkromný poslucháč ProgressListener; súkromné dlho prevedené; private long totalBytes; public CountingOutputStream (OutputStream out, poslucháč ProgressListener, dlhé totalBytes) {super (out); this.listener = poslucháč; prenesene = 0; this.totalBytes = totalBytes; } @Override public void write (byte [] b, int off, int len) vyvolá IOException {out.write (b, off, len); prenesene + = len; listener.progress (getCurrentProgress ()); } @Override public void write (int b) hodí IOException {out.write (b); prenesene ++; listener.progress (getCurrentProgress ()); } súkromný plavák getCurrentProgress () {návrat ((plavák) prenesený / totalBytes) * 100; }}
Poznač si to:
- Pri predlžovaní FilterOutputStream „CountingOutputStream ”- prekonávame napíš () metóda na spočítanie zapísaných (prenesených) bajtov
- Pri predlžovaní HttpEntityWrapper „ProgressEntityWrapper ”- prekonávame Písať() spôsob použitia našej „CountingOutputStream“
9. Záver
V tomto výučbe sme ilustrovali najbežnejšie spôsoby odosielania POST HTTP požiadaviek pomocou Apache HttpClient 4.
Naučili sme sa, ako poslať požiadavku POST s autorizáciou, ako zverejňovať pomocou HttpClient plynulé API a ako nahrať súbor a sledovať jeho priebeh.
Implementáciu všetkých týchto príkladov a útržkov kódu nájdete v projekte github.