Vodič za Google-Http-klijenta

1. Pregled

U ovom ćemo članku pogledati Google HTTP Client Library za Javu, brzu, dobro apstrahiranu knjižnicu za pristup bilo kojim resursima putem protokola HTTP veze.

Glavne značajke klijenta su:

  • sloj apstrakcije HTTP-a koji vam omogućuje razdvajanje bilo koje biblioteke na niskoj razini
  • brzi, učinkoviti i fleksibilni JSON i XML modeli raščlanjivanja sadržaja HTTP odgovora i zahtjeva
  • jednostavne za upotrebu bilješke i apstrakcije za mapiranje HTTP resursa

Biblioteka se također može koristiti u Javi 5 i novijim verzijama, što je čini značajnim izborom za naslijeđene (SE i EE) projekte.

U ovom ćemo članku razviti jednostavnu aplikaciju koja povezat će se s GitHub API-jem i dohvatiti korisnike, dok pokriva neke od najzanimljivijih značajki knjižnice.

2. Ovisnosti Mavena

Za upotrebu knjižnice trebat će nam google-http-klijent ovisnost:

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

Najnoviju verziju možete pronaći na Maven Central.

3. Podnošenje jednostavnog zahtjeva

Krenimo s jednostavnim GET zahtjevom na GitHub stranicu kako bismo pokazali kako Google Http klijent radi izvan okvira:

HttpRequestFactory requestFactory = novi NetHttpTransport (). CreateRequestFactory (); HttpRequest zahtjev = requestFactory.buildGetRequest (novi GenericUrl ("// github.com")); Niz rawResponse = request.execute (). ParseAsString ()

Da bismo napravili najjednostavniji zahtjev, trebat će nam barem:

  • HttpRequestFactory ovo se koristi za izgradnju naših zahtjeva
  • HttpTransport apstrakcija HTTP sloja niske razine
  • GenericUrl klasa koja obavija URL
  • HttpRequest obrađuje stvarno izvršenje zahtjeva

Kroz sve ove i složeniji primjer proći ćemo sa stvarnim API-jem koji vraća JSON format u sljedećim odjeljcima.

4. Priključljivi HTTP transport

Knjižnica ima dobro apstrahiranu HttpTransport klasa koja nam omogućuje da na njoj gradimo i prijeđite na osnovnu odabranu HTTP knjižnicu prijenosa na niskoj razini:

javna klasa GitHubExample {static HttpTransport HTTP_TRANSPORT = new NetHttpTransport (); }

U ovom primjeru koristimo NetHttpTransport, koji se temelji na HttpURLConnection koji se nalazi u svim Java SDK-ovima. Ovo je dobar početni izbor jer je dobro poznat i pouzdan.

Naravno, možda postoji slučaj kada trebamo neke napredne prilagodbe, a time i zahtjev za složenijom bibliotekom na niskoj razini.

Za ovu vrstu slučajeva postoji ApacheHttpTransport:

javna klasa GitHubExample {static HttpTransport HTTP_TRANSPORT = new ApacheHttpTransport (); }

The ApacheHttpTransport temelji se na popularnom Apache HttpClientu koji uključuje širok izbor izbora za konfiguriranje veza.

Uz to, knjižnica nudi mogućnost izrade vaše implementacije na niskoj razini, čineći je vrlo fleksibilnom.

5. JSON raščlanjivanje

Google Http klijent uključuje još jednu apstrakciju za JSON raščlanjivanje. Glavna prednost ovoga je ta izbor biblioteke za raščlanjivanje na niskoj razini je zamjenjiv.

Ugrađena su tri izbora koja se sve protežu JsonFactory, a uključuje i mogućnost implementacije vlastite.

5.1. Izmjenjiva knjižnica za raščlanjivanje

U našem primjeru koristit ćemo implementaciju Jackson2, koja zahtijeva google-http-client-jackson2 ovisnost:

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

Nakon toga, sada možemo uključiti JsonFactory:

javna klasa GitHubExample {static HttpTransport HTTP_TRANSPORT = new NetHttpTransport (); staticJsonFactory JSON_FACTORY = novo JacksonFactory (); }

The JacksonFactory je najbrža i najpopularnija knjižnica za operacije raščlanjivanja / serializacije.

To dolazi na štetu veličine knjižnice (što bi moglo zabrinuti u određenim situacijama). Iz tog razloga, Google također nudi GsonFactory, koja je implementacija Google GSON knjižnice, lagane JSON biblioteke za raščlanjivanje.

Također postoji mogućnost pisanja naše implementacije parsera na niskoj razini.

5.2. @Ključ Bilješka

Možemo koristiti @Ključ napomena koja označava polja koja trebaju biti raščlanjena ili serilizirana u JSON:

javna klasa Korisnik {@Key private String prijava; @Ključni privatni dugi ID; @Key ("email") privatni niz e-pošte; // standardni geteri i postavljači}

Ovdje izrađujemo Korisnik apstrakcija koju dobivamo u paketu od GitHub API-ja (do stvarnog raščlanjivanja doći ćemo kasnije u ovom članku).

Imajte na umu da polja koja nemaju @Ključ napomene smatraju se internim i ne raščlanjuju se ili serializiraju u JSON. Također, vidljivost polja nije bitna, kao ni postojanje metoda getera ili postavljača.

Možemo odrediti vrijednost @Ključ napomena, kako bi se preslikala na ispravan JSON ključ.

5.3. GeneričkiJson

Samo polja koja deklariramo i označavamo kao @Ključ raščlanjeni su.

Da bismo zadržali drugi sadržaj, možemo izjaviti da se naša klasa proširuje GenericJson:

korisnik javne klase proširuje GenericJson {// ...}

GeneričkiJson provodi Karta sučelje, što znači da možemo koristiti metode get i put za postavljanje / dobivanje JSON sadržaja u zahtjevu / odgovoru.

6. Upućivanje poziva

Da bismo se povezali s krajnjom točkom pomoću Google Http klijenta, trebat će nam HttpRequestFactory, koji će biti konfiguriran s našim prethodnim apstrakcijama HttpTransport i JsonFactory:

javna klasa GitHubExample {static HttpTransport HTTP_TRANSPORT = new NetHttpTransport (); statički JsonFactory JSON_FACTORY = novi JacksonFactory (); privatna statička void run () baca izuzetak {HttpRequestFactory requestFactory = HTTP_TRANSPORT.createRequestFactory ((HttpRequest zahtjev) -> {request.setParser (novi JsonObjectParser (JSON_FACTORY));}); }}

Sljedeće što će nam trebati je URL za povezivanje. Knjižnica to rješava kao produženje klase GenericUrl na kojem se bilo koje deklarirano polje tretira kao parametar upita:

javna klasa GitHubUrl proširuje GenericUrl {public GitHubUrl (String encodedUrl) {super (encodedUrl); } @Key public int per_page; }

Ovdje u našem GitHubUrl, izjavljujemo po stranici svojstvo da označi koliko korisnika želimo u jednom pozivu GitHub API-ju.

Nastavimo graditi svoj poziv koristeći GitHubUrl:

privatna statička void run () baca izuzetak {HttpRequestFactory requestFactory = HTTP_TRANSPORT.createRequestFactory ((HttpRequest zahtjev) -> {request.setParser (novi JsonObjectParser (JSON_FACTORY));}); GitHubUrl url = novi GitHubUrl ("// api.github.com/users"); url.per_page = 10; HttpRequest zahtjev = requestFactory.buildGetRequest (url); Tip tipa = novi TypeToken() {} .getType (); Popis korisnika = (Popis) zahtjev .execute () .parseAs (vrsta); }

Primijetite kako odredujemo koliko će nam korisnika trebati za API poziv, a zatim gradimo zahtjev pomoću HttpRequestFactory.

Slijedom toga, budući da odgovor GitHub API-ja sadrži popis korisnika, moramo pružiti kompleks Tip, što je a Popis.

Zatim, na zadnjoj liniji, upućujemo poziv i raščlanjujemo odgovor na popis naših Korisnik razred.

7. Prilagođena zaglavlja

Jedna stvar koju obično radimo kada podnosimo zahtjev za API je da uključimo nekakvo prilagođeno zaglavlje ili čak modificirano:

HttpHeaders zaglavlja = request.getHeaders (); headers.setUserAgent ("Klijent Baeldung"); headers.set ("Vremenska zona", "Europa / Amsterdam");

To radimo dobivanjem HttpHeaders nakon što smo kreirali svoj zahtjev, ali prije izvršenja i dodavanja potrebnih vrijednosti.

Imajte na umu da Google Http klijent uključuje neka zaglavlja kao posebne metode. The Korisnički agent zaglavlje, na primjer, ako ga pokušamo uključiti samo s postavljenom metodom, to će dovesti do pogreške.

8. Eksponencijalni Backoff

Druga važna značajka Google Http klijenta je mogućnost ponovnog pokušaja zahtjeva na temelju određenih statusnih kodova i pragova.

Naše eksponencijalne postavke možemo uključiti odmah nakon što kreiramo objekt zahtjeva:

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

Eksponencijalni Backoff isključen je prema zadanim postavkama u HttpRequest, tako da moramo uključiti primjerak HttpUnsuccessfulResponseHandler prema HttpRequest da ga aktiviram.

9. Sječa drva

Google Http klijent koristi java.util.logging.Logger za bilježenje detalja HTTP zahtjeva i odgovora, uključujući URL, zaglavlja i sadržaj.

Zapisivanjem se obično upravlja pomoću a sječa drva.svojstva datoteka:

handlers = java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.level = SVE com.google.api.client.http.level = SVE

U našem primjeru koristimo ConsoleHandler, ali također je moguće odabrati FileHandler.

Datoteka svojstava konfigurira rad JDK uređaja za evidentiranje. Ova konfiguracijska datoteka može se navesti kao svojstvo sustava:

-Djava.util.logging.config.file = logging.properties

Dakle, nakon postavljanja svojstva datoteke i sustava, knjižnica će izraditi zapisnik poput sljedećeg:

-------------- UPIT -------------- GET //api.github.com/users?page=1&per_page=10 Prihvati-kodiraj: gzip Korisnički agent: Google-HTTP-Java-Client / 1.23.0 (gzip) 12. studenog 2017. 18:43:15 com.google.api.client.http.HttpRequest izvršiti curl -v --compressed -H 'Prihvati -Encoding: gzip '-H' User-Agent: Google-HTTP-Java-Client / 1.23.0 (gzip) '-' //api.github.com/users?page=1&per_page=10 '12. studenog 2017. 18:43:16 PM com.google.api.client.http.HttpResponse -------------- RESPONSE -------------- HTTP / 1.1 200 U redu Status: 200 U redu Prijenos-kodiranje: podijeljeno Poslužitelj: GitHub.com Access-Control-Allow-Origin: * ... Link:; rel = "sljedeće",; rel = "first" X-GitHub-Request-Id: 8D6A: 1B54F: 3377D97: 3E37B36: 5A08DC93 Content-Type: application / json; charset = utf-8 ...

10. Zaključak

U ovom smo uputstvu prikazali Google HTTP Client Library za Javu i njegove korisnije značajke. Njihov Github sadrži više informacija o njemu, kao i izvorni kod knjižnice.

Kao i uvijek, puni izvorni kod ovog vodiča dostupan je na GitHub-u.