Ú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.