Feladás a HttpClient szolgáltatással

1. Áttekintés

Ebben az oktatóanyagban - mi postázzuk a HttpClient 4 - az első engedély, majd a folyékony HttpClient API használatával.

Végül megvitatjuk, hogyan lehet feltölteni egy fájlt a Httpclient használatával.

2. Alapvető POST

Először nézzünk át egy egyszerű példát, és küldjünk egy POST kérést a HttpClient.

Két paraméterrel elvégezzük a POST-ot - “felhasználónév”És„Jelszó“:

@Test public void whenSendPostRequestUsingHttpClient_thenCorrect () dobja a ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = new HttpPost ("// www.example.com"); List params = new ArrayList (); params.add (új BasicNameValuePair ("felhasználónév", "John")); params.add (új BasicNameValuePair ("jelszó", "átadás")); httpPost.setEntity (új UrlEncodedFormEntity (paraméterek)); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

Vegye figyelembe, hogyan használtuk a Lista nak,-nek NameValuePair paraméterek felvétele a POST kérésbe.

3. POST engedélyezéssel

Ezután nézzük meg, hogyan kell elvégezni a POST-ot a hitelesítési hitelesítő adatokkal a HttpClient.

A következő példában - POST kérést küldünk egy URL-hez, amely alapvető hitelesítéssel van védve, egy Engedélyezés fejléc hozzáadásával:

@Test public void whenSendPostRequestWithAuthorizationUsingHttpClient_thenCorrect () dobja a ClientProtocolException, IOException, AuthenticationException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = new HttpPost ("// www.example.com"); httpPost.setEntity (új StringEntity ("tesztpost")); UsernamePasswordCredentials creds = új UsernamePasswordCredentials ("John", "pass"); httpPost.addHeader (új BasicScheme (). hitelesítés (kredit, httpPost, null)); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

4. POST JSON-nal

Most - nézzük meg, hogyan küldhetünk POST kérést JSON törzszel a HttpClient.

A következő példában - küldünk néhányat személy információ (id, név) JSON néven:

@Test public void whenPostJsonUsingHttpClient_thenCorrect () dobja a ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = new HttpPost ("// www.example.com"); Karakterlánc json = "{" id ": 1," név ":" John "}"; StringEntity entitás = new StringEntity (json); httpPost.setEntity (entitás); httpPost.setHeader ("Elfogadás", "alkalmazás / json"); httpPost.setHeader ("Tartalomtípus", "alkalmazás / json"); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

Vegye figyelembe, hogyan használjuk a StringEntity a kérés törzsének megadásához.

Beállítjuk a Tartalom típus fejléc alkalmazás / jsonhogy a szerver megkapja a szükséges információkat az általunk küldött tartalom megjelenítéséről.

5. POST A HttpClient Fluent API

Ezután tegyük közzé a HttpClient Folyékony API.

Két paraméterrel küldünk egy kéréstfelhasználónév”És„Jelszó“:

@Test public void whenPostFormUsingHttpClientFluentAPI_thenCorrect () dob ClientProtocolException, IOException {HttpResponse response = Request.Post ("// www.example.com"). BodyForm (Form.form (). Add ("felhasználónév", "John") add. ("jelszó", "átadás"). build ()) .execute (). returnResponse (); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); }

6. POST Többrészes kérés

Most tegyünk közzé egy többrészes kérelmet.

Feladunk egy File, felhasználónév és jelszó használatával MultipartEntityBuilder:

@Test public void whenSendMultipartRequestUsingHttpClient_thenCorrect () dobja a ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = new HttpPost ("// www.example.com"); MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.addTextBody ("felhasználónév", "John"); builder.addTextBody ("jelszó", "átadás"); builder.addBinaryBody ("fájl", új Fájl ("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "file.ext"); HttpEntity multipart = builder.build (); httpPost.setEntity (többrészes); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

7. Töltse fel a File Használata HttpClient

Ezután nézzük meg, hogyan lehet feltölteni a File használni a HttpClient.

Feltöltjük atest.txt”Fájl segítségével MultipartEntityBuilder:

@Test public void whenUploadFileUsingHttpClient_thenCorrect () dobja a ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = new HttpPost ("// www.example.com"); MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.addBinaryBody ("fájl", új Fájl ("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "file.ext"); HttpEntity multipart = builder.build (); httpPost.setEntity (többrészes); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

8. Szerezd meg File FeltöltésElőrehalad

Végül - nézzük meg, hogyan lehet elérni a haladást File segítségével töltsd fel HttpClient.

A következő példában kibővítjük a HttpEntityWrapper hogy láthassák a feltöltési folyamatot.

Először - íme a feltöltés módja:

@Test public void whenGetUploadFileProgressUsingHttpClient_thenCorrect () dobja az ClientProtocolException, IOException {CloseableHttpClient client = HttpClients.createDefault (); HttpPost httpPost = new HttpPost ("// www.example.com"); MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.addBinaryBody ("fájl", új Fájl ("test.txt"), ContentType.APPLICATION_OCTET_STREAM, "file.ext"); HttpEntity multipart = builder.build (); ProgressEntityWrapper.ProgressListener pListener = százalék -> assertFalse (Float.compare (százalékos, 100)> 0); httpPost.setEntity (új ProgressEntityWrapper (többrészes, pListener)); CloseableHttpResponse response = client.execute (httpPost); assertThat (response.getStatusLine (). getStatusCode (), equalTo (200)); client.close (); }

Hozzáadjuk a kezelőfelületet is ProgressListener amely lehetővé teszi számunkra a feltöltés előrehaladásának megfigyelését:

nyilvános statikus felület ProgressListener {void progress (lebegő százalék); }

És itt van a kiterjesztett változatunk HttpEntityWrapper ProgressEntityWrapper“:

public class ProgressEntityWrapper kiterjeszti a HttpEntityWrapper {private ProgressListener hallgatót; public ProgressEntityWrapper (HttpEntity entitás, ProgressListener hallgató) {super (entitás); this.listener = hallgató; } @Orride public void writeTo (OutputStream outstream) dobja az IOException-t {super.writeTo (új CountingOutputStream (outstream, hallgató, getContentLength ())); }} 

És a kiterjesztett változata FilterOutputStreamCountingOutputStream“:

public static class CountingOutputStream kiterjeszti a FilterOutputStream {private ProgressListener hallgatót; hosszú ideig átadott magán; privát hosszú totalBytes; public CountingOutputStream (OutputStream out, ProgressListener figyelő, long totalBytes) {szuper (ki); this.listener = hallgató; átvitt = 0; this.totalBytes = totalBytes; } @Orride public void write (byte [] b, int off, int len) dobja az IOException-t {out.write (b, off, len); átruházva + = len; hallgató.progress (getCurrentProgress ()); } @Orride public void write (int b) dobja az IOException-t {out.write (b); átvitt ++; hallgató.progress (getCurrentProgress ()); } privát float getCurrentProgress () {return ((float) átadott / totalBytes) * 100; }}

Vegye figyelembe, hogy:

  • Hosszabbításkor FilterOutputStream nak nek "CountingOutputStream ”- felülírjuk a ír() módszer az írott (átvitt) bájtok számlálására
  • Hosszabbításkor HttpEntityWrapper nak nek "ProgressEntityWrapper ”- felülírjuk a írj neki() módszer a mi „CountingOutputStream”

9. Következtetés

Ebben az oktatóanyagban bemutattuk a POST HTTP kérések leggyakoribb módjait a Apache HttpClient 4.

Megtanultuk, hogyan lehet POST-kérelmet küldeni az Engedélyezéssel, hogyan lehet feladni a használatával HttpClient folyékony API és hogyan tölthet fel egy fájlt, és hogyan követheti annak előrehaladását.

Mindezen példák és kódrészletek megvalósítása megtalálható a github projektben.