Útmutató a Google-Http-Clienthez

1. Áttekintés

Ebben a cikkben megnézzük a Java Google HTTP kliens könyvtárát, amely egy gyors, jól elvont könyvtár, amely bármilyen erőforráshoz hozzáférhet a HTTP kapcsolati protokollon keresztül.

Az ügyfél főbb jellemzői:

  • egy HTTP absztrakciós réteg, amely lehetővé teszi bármely alacsony szintű könyvtár leválasztását
  • gyors, hatékony és rugalmas JSON és XML elemzési modellek a HTTP válaszra és kérelem tartalomra
  • könnyen használható kommentárok és absztrakciók a HTTP erőforrás leképezésekhez

A könyvtár Java 5 és újabb verziókban is használható, ami jelentős választást jelent a régi (SE és EE) projektek számára.

Ebben a cikkben egy egyszerű alkalmazást fejlesztünk ki csatlakozni fog a GitHub API-hoz, és lekéri a felhasználókat, miközben lefedi a könyvtár legérdekesebb jellemzőit.

2. Maven-függőségek

A könyvtár használatához szükségünk lesz a google-http-kliens függőség:

 com.google.http-kliens google-http-kliens 1.23.0 

A legújabb verzió a Maven Central oldalon található.

3. Egyszerű kérés benyújtása

Kezdjük azzal, hogy egy egyszerű GET kérést küldünk a GitHub oldalra annak bemutatásához, hogy a Google Http kliens hogyan működik a dobozból:

HttpRequestFactory requestFactory = new NetHttpTransport (). CreateRequestFactory (); HttpRequest kérés = requestFactory.buildGetRequest (új GenericUrl ("// github.com")); String rawResponse = request.execute (). ParseAsString ()

A legegyszerűbb kéréshez legalább a következőkre lesz szükségünk:

  • HttpRequestFactory ezt felhasználjuk kéréseink felépítésére
  • HttpTransport az alacsony szintű HTTP szállítási réteg absztrakciója
  • GenericUrl osztály, amely beburkolja az URL-t
  • HttpRequest kezeli a kérelem tényleges végrehajtását

Mindezeket és egy összetettebb példát áttekintünk egy tényleges API-val, amely JSON formátumot ad vissza a következő szakaszokban.

4. Pluggable HTTP Transport

A könyvtár jól elvont HttpTransport osztály, amely lehetővé teszi számunkra, hogy a tetejére építsünk, és váltás az alapul szolgáló alacsony szintű HTTP szállítási könyvtárra:

public class GitHubExample {static HttpTransport HTTP_TRANSPORT = new NetHttpTransport (); }

Ebben a példában a NetHttpTransport, amely a HttpURLConnection amely megtalálható az összes Java SDK-ban. Ez egy jó kiinduló választás, mivel jól ismert és megbízható.

Természetesen előfordulhat olyan eset, amikor valamilyen fejlett testreszabásra van szükségünk, és így egy bonyolultabb alacsony szintű könyvtár követelményére.

Ilyen esetekre a ApacheHttpTransport:

public class GitHubExample {static HttpTransport HTTP_TRANSPORT = new ApacheHttpTransport (); }

A ApacheHttpTransport alapja a népszerű Apache HttpClient, amely a kapcsolatok konfigurálásához sokféle lehetőséget kínál.

Ezenkívül a könyvtár lehetőséget nyújt alacsony szintű megvalósításának felépítésére, ami nagyon rugalmasá teszi.

5. JSON elemzés

A Google Http kliens egy másik kivonatot tartalmaz a JSON elemzéséhez. Ennek egyik fő előnye az az alacsony szintű elemző könyvtár választása felcserélhető.

Három beépített lehetőség van, amelyek mindegyike kiterjed JsonFactory, és magában foglalja a saját megvalósításának lehetőségét is.

5.1. Cserélhető elemző könyvtár

Példánkban a Jackson2 megvalósítást fogjuk használni, amelyhez a google-http-client-jackson2 függőség:

 com.google.http-client google-http-client-jackson2 1.23.0 

Ezt követően most felvehetjük a JsonFactory:

public class GitHubExample {static HttpTransport HTTP_TRANSPORT = new NetHttpTransport (); staticJsonFactory JSON_FACTORY = új JacksonFactory (); }

A JacksonFactory a leggyorsabb és legnépszerűbb elemzési / sorosítási műveletek könyvtár.

Ez a könyvtár méretének árával jár (ami bizonyos helyzetekben aggodalomra adhat okot). Emiatt a Google biztosítja a GsonFactory, amely a Google GSON könyvtár, egy könnyű JSON elemző könyvtár megvalósítása.

Alacsony szintű értelmező implementációnk megírására is lehetőség van.

5.2. A @Kulcs Megjegyzés

Használhatjuk a @Kulcs kommentár a JSON-ról elemzendő vagy sorosított mezők jelzésére:

public class User {@Key private String bejelentkezés; @Kulcs hosszú magán azonosító; @Key ("email") privát karakterlánc e-mail; // szabványos mérőeszközök és beállítók}

Itt készítünk egy Felhasználó absztrakció, amelyet kötegenként kapunk a GitHub API-tól (a cikk későbbi elemzéséhez eljutunk).

Kérjük, vegye figyelembe, hogy mezők, amelyek nem rendelkeznek a @Kulcs az annotáció belsőnek tekinthető, és nem a JSON-ról van elemezve vagy sorosítva. Továbbá a mezők láthatósága sem számít, és a getter vagy setter módszerek megléte sem.

Megadhatjuk a @Kulcs annotáció, a megfelelő JSON kulcshoz való hozzárendeléshez.

5.3. GenericJson

Csak azok a mezők, amelyeket deklarálunk, és amelyeknek jelöljük @Kulcs elemzik.

A másik tartalom megtartása érdekében kijelenthetjük, hogy osztályunk kiterjeszkedik GenericJson:

public class Felhasználó kiterjeszti a GenericJson alkalmazást {// ...}

GenericJson végrehajtja a Térkép interfész, ami azt jelenti, hogy a get and put módszereket használhatjuk a JSON-tartalom beállításához / megszerzéséhez a kérelemben / válaszban.

6. Hívás kezdeményezése

A végponthoz való kapcsolódáshoz a Google Http klienssel szükségünk lesz egy HttpRequestFactory, amelyet a korábbi absztrakcióinkkal konfigurálunk HttpTransport és JsonFactory:

public class GitHubExample {static HttpTransport HTTP_TRANSPORT = new NetHttpTransport (); statikus JsonFactory JSON_FACTORY = új JacksonFactory (); private static void run () dobja a Kivételt {HttpRequestFactory requestFactory = HTTP_TRANSPORT.createRequestFactory ((HttpRequest kérés) -> {request.setParser (új JsonObjectParser (JSON_FACTORY));}); }}

A következő dologra szükségünk lesz egy URL-re, amelyhez csatlakozhatunk. A könyvtár ezt osztálybővítésként kezeli GenericUrl amelyen bármelyik deklarált mező lekérdezési paraméterként kezelendő:

a GitHubUrl nyilvános osztály kiterjeszti a GenericUrl {public GitHubUrl (String encodedUrl) {super (encodedUrl); } @Key public int per_page; }

Itt a mi GitHubUrl, kijelentjük a oldalanként tulajdonság azt jelzi, hogy hány felhasználót akarunk egy hívásban a GitHub API-hoz.

Folytassuk hívásunk kiépítését a GitHubUrl:

private static void run () dobja a Kivételt {HttpRequestFactory requestFactory = HTTP_TRANSPORT.createRequestFactory ((HttpRequest kérés) -> {request.setParser (új JsonObjectParser (JSON_FACTORY));}); GitHubUrl url = új GitHubUrl ("// api.github.com/users"); url.oldal_oldal = 10; HttpRequest kérés = requestFactory.buildGetRequest (url); Type type = new TypeToken() {} .getType (); Lista felhasználók = (Lista) kérés .execute () .parseAs (típus); }

Figyelje meg, hogyan adjuk meg, hány felhasználóra lesz szükségünk az API-híváshoz, majd a kéréssel építjük a HttpRequestFactory.

Ezt követően, mivel a GitHub API válasza tartalmazza a felhasználók listáját, komplexumot kell biztosítanunk típus, ami a Lista.

Ezután az utolsó sorban felhívjuk és elemezzük a választ egy listánkra Felhasználó osztály.

7. Egyéni fejlécek

Az egyik dolog, amit általában teszünk egy API-kérés elkészítésekor, az az, hogy tartalmazzon valamilyen egyedi fejlécet, vagy akár módosítottat is:

HttpHeaders fejlécek = request.getHeaders (); fejlécek.setUserAgent ("Baeldung Client"); headers.set ("Időzóna", "Európa / Amszterdam");

Ezt úgy tesszük, hogy megszerezzük a HttpHeaders miután létrehoztuk a kérésünket, de mielőtt végrehajtanánk és hozzáadnánk a szükséges értékeket.

Felhívjuk figyelmét, hogy a Google Http kliens tartalmaz néhány fejlécet speciális módszerként. A User-Agent fejléc például, ha megpróbáljuk csak a set metódussal szerepeltetni, akkor hibát okozna.

8. Exponenciális hátralépés

A Google Http kliens másik fontos tulajdonsága, hogy bizonyos állapotkódok és küszöbértékek alapján megkísérelheti újra a kéréseket.

A kérelemobjektum létrehozása után azonnal felvehetjük az exponenciális háttérbeállításokat:

ExponentialBackOff backoff = új ExponentialBackOff.Builder () .setInitialIntervalMillis (500) .setMaxElapsedTimeMillis (900000) .setMaxIntervalMillis (6000) .setMultiplier (1.5) .setRandomizationFactor (0.5) .build (); request.setUnsuccessfulResponseHandler (új HttpBackOffUnsuccessfulResponseHandler (backoff));

Az Exponential Backoff alapértelmezés szerint ki van kapcsolva HttpRequest, ezért bele kell foglalnunk a HttpUnsuccessfulResponseHandler hoz HttpRequest hogy aktiválja.

9. Naplózás

A Google Http kliens használja java.util.logging.Logger a HTTP kérés és válasz részleteinek naplózásához, beleértve az URL-t, a fejléceket és a tartalmat.

Általában a naplózást a naplózás.tulajdonságok fájl:

kezelők = java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.level = ALL com.google.api.client.http.level = ALL

Példánkban használjuk ConsoleHandler, de lehetőség van a FileHandler.

A tulajdonságfájl konfigurálja a JDK naplózási lehetőség működését. Ez a konfigurációs fájl rendszer tulajdonságként határozható meg:

-Djava.util.logging.config.file = naplózás.tulajdonságok

Tehát a fájl és a rendszer tulajdonságának beállítása után a könyvtár naplót készít, amely a következő:

-------------- KÉRÉS -------------- GET //api.github.com/users?page=1&per_page=10 Elfogadás-kódolás: gzip User-Agent: Google-HTTP-Java-Client / 1.23.0 (gzip) 2017. november 12, 18:43:15 com.google.api.client.http.HttpRequest végrehajtja a curl -v --compressed -H 'Accept parancsot -Ekódolás: gzip '-H' User-Agent: Google-HTTP-Java-Client / 1.23.0 (gzip) '-' //api.github.com/users?page=1&per_page=10 '2017. november 12. 18:43:16 com.google.api.client.http.HttpResponse -------------- RESPONSE -------------- HTTP / 1.1 200 OK állapot: 200 OK Transfer-Encoding: darabos kiszolgáló: GitHub.com Access-Control-Allow-Origin: * ... Link:; rel = "következő",; rel = "first" X-GitHub-Request-Id: 8D6A: 1B54F: 3377D97: 3E37B36: 5A08DC93 Tartalom-típus: alkalmazás / json; karakterkészlet = utf-8 ...

10. Következtetés

Ebben az oktatóanyagban bemutattuk a Google HTTP kliens könyvtárát a Java számára és annak hasznosabb szolgáltatásait. Github-juk további információkat tartalmaz, valamint a könyvtár forráskódját.

Mint mindig, az oktatóanyag teljes forráskódja elérhető a GitHubon.


$config[zx-auto] not found$config[zx-overlay] not found