TL; DR verzió
Az egyik korábbi bejegyzésben röviden megvitattuk, milyen a GitHub API v3 használata. Ezt a verziót úgy tervezték, hogy bármilyen más REST API-hoz hasonlóan interfész legyen. Minden erőforráshoz vannak végpontok, amelyekhez hozzáférni és / vagy módosítani kell. Minden felhasználónak, szervezetnek, minden adattárnak és így tovább vannak végpontjai. Például minden felhasználó API-végpontja a https: // api címen található.github.com / users /
A GitHub API v4 viszont a GraphQL-t használja, ahol a QL jelentése Query Language. A GraphQL az API-k tervezésének új módja. Csakúgy, mint sok REST API-ként kínált webszolgáltatást, nem csak a GitHub által kínáltakat, sok olyan webszolgáltatás is létezik, amelyek lehetővé teszik, hogy a GraphQL-en keresztül kapcsolódjon velük.
A legnagyobb különbség, amelyet észrevesz a GraphQL és a REST API között, az, hogy a GraphQL egyetlen API-végpontot képes kezelni. A GitHub API v4 esetében ez a végpont a https: // api.github.com / graphql és ennyi. Nem kell aggódnia a hosszú karakterláncok csatolásával a gyökér URI végén, vagy további információkért meg kell adnia egy lekérdezési karakterlánc-paramétert. Egyszerűen elküld egy JSON-szerű argumentumot ennek az API-nak, és csak a szükséges dolgokat kéri, és egy JSON hasznos terhet kap vissza pontosan ugyanazokkal az információkkal, amelyeket kért. Nem kell foglalkoznia a nemkívánatos információk kiszűrésével, vagy a nagy válaszok miatt teljesítmény-rezsi miatt kell szenvednie.
Mi a REST API?
Nos, a REST a reprezentatív állapotátvitel, az API pedig az alkalmazásprogramozási felület. A REST API vagy egy „RESTful” API vált a legtöbb modern kliens-szerver alkalmazás mögött álló tervezési filozófiává. Az ötlet abból adódik, hogy el kell különíteni az alkalmazás különböző összetevőit, például az ügyféloldali felhasználói felületet és a szerveroldali logikát.
Tehát az ügyfél és a szerver közötti munkamenet általában hontalan. Miután a weboldal és a kapcsolódó szkriptek betöltődtek, folytathatja a műveletet velük, és amikor végrehajt egy műveletet (például megnyom egy küldési gombot), akkor küld egy küldési kérelmet az összes kontextusinformációval együtt, amelyre a webszervernek szüksége van a kérés feldolgozásához ( például felhasználónév, tokenek stb.). Az alkalmazás áttér az egyik állapotról a másikra, de nem szükséges állandó kapcsolat az ügyfél és a kiszolgáló között.
A REST korlátozások halmazát határozza meg az ügyfél és a kiszolgáló között, és a kommunikáció csak ezeken a korlátozásokon keresztül valósulhat meg. Például a REST HTTP felett általában a CRUD modellt használja, amely a Létrehozás, Olvasás, Frissítés és Törlés rövidítéseket jelenti, és az olyan HTTP módszerek, mint a POST, GET, PUT és DELETE, segítenek ezeknek a műveleteknek és ezeknek a műveleteknek a végrehajtásában. A régi behatolási technikák, például az SQL injekciók, nem jelentenek lehetőséget a szorosan megírt REST API-val (bár a REST nem biztonsági csodaszer).
A felhasználói felület fejlesztőinek is nagyon sokat segít! Mivel csak egy HTTP-kérésből érkezik, tipikus szövegfolyam (néha JSON formátumban van), könnyen megvalósíthat egy weboldalt a böngészőkhöz vagy egy alkalmazást (a kívánt nyelven), anélkül, hogy aggódna a szerveroldali architektúra miatt. Olvassa el az olyan szolgáltatások API-dokumentációját, mint a Reddit, a Twitter vagy a Facebook, és írhat bővítményeket nekik vagy külső ügyfeleknek az Ön által választott nyelven, mivel garantáltan garantálja, hogy az API viselkedése továbbra is ugyanaz lesz.
Ezzel szemben a szervert nem érdekli, hogy a kezelőfelület Go, Ruby vagy Python nyelven íródott-e. Legyen szó böngészőről, alkalmazásról vagy CLI-ről. Csak „látja” a kérést és megfelelően reagál.
Mi a GraphQL?
Mint bármi más a számítógépek világában, a REST API-k is nagyobbak és összetettebbek lettek, ugyanakkor az emberek gyorsabb és egyszerűbb módon akarták őket bevezetni és fogyasztani. Ezért a Facebook felvetette a GraphQL ötletét, majd később megnyitotta. A GraphQL QL jelentése Query Language.
A GraphQL lehetővé teszi az ügyfelek számára, hogy nagyon specifikus API-kéréseket tegyenek, ahelyett, hogy merev API-hívásokat végeznének előre meghatározott paraméterekkel és válaszokkal. Sokkal egyszerűbb, mert a szerver ezután pontosan azokkal az adatokkal válaszol, amelyeket Ön kért, semmi fölösleggel.
Vessen egy pillantást erre a REST kérésre és a hozzá tartozó válaszra. Ez a kérés csak a felhasználó nyilvános életrajzát hivatott megtekinteni.
Kérés: GET https: // api.github.com / users /Válasz:
"login": "octocat",
"id": 583231,
"node_id": "MDQ6VXNlcjU4MzIzMQ ==",
"avatar_url": "https: // avatars3.githubusercontent.com / u / 583231?v = 4 ",
"gravatar_id": "",
"url": "https: // api.github.com / users / octocat ",
"html_url": "https: // github.com / octocat ",
"followers_url": "https: // api.github.com / users / octocat / followers ",
"following_url": "https: // api.github.com / users / octocat / követés / other_user ",
"gists_url": "https: // api.github.com / users / octocat / gists / gist_id ",
"starred_url": "https: // api.github.com / users / octocat / csillagozott / owner / repo ",
"előfizetések_url": "https: // api.github.com / users / octocat / subscriptions ",
"szervezetek_url": "https: // api.github.com / users / octocat / orgs ",
"repos_url": "https: // api.github.com / users / octocat / repos ",
"events_url": "https: // api.github.com / users / octocat / events / privacy ",
"kapott_események_url": "https: // api.github.com / users / octocat / receives_events ",
"type": "Felhasználó",
"site_admin": hamis,
"name": "Az Octocat",
"társaság": "GitHub",
"blog": "http: // www.github.com / blog ",
"hely": "San Francisco",
"email": null,
"bérelhető": null,
"bio": null,
"public_repos": 8,
"public_gists": 8,
"követők": 2455,
"következő": 9,
"created_at": "2011-01-25T18: 44: 36Z",
"updated_at": "2018-11-22T16: 00: 23Z"
Használtam az octocat felhasználónevet, de helyettesítheti az Ön által választott felhasználónévvel, és a cURL paranccsal megadhatja ezt a kérést a parancssorban vagy a Postman-ben, ha GUI-ra van szüksége. Bár a kérés egyszerű volt, gondoljon át minden további információra, amelyet ebből a válaszból kap. Ha millió ilyen felhasználó adatait dolgozná fel, és az összes felesleges adatot kiszűrné a használatával, az nem hatékony. Elpazarolja a sávszélességet, a memóriát és a számítást az összes millió kulcsérték-pár megszerzésében, tárolásában és kiszűrésében, amelyeket soha nem fog
A válasz felépítése szintén nem olyan, amit előzetesen tud. Ez a JSON válasz egyenértékű a Python szótárobjektumával vagy a JavaScript egy objektumával. Más végpontok olyan JSON-objektumokkal válaszolnak, amelyek beágyazott objektumokból, az objektumon belüli beágyazott listából vagy a JSON adattípusok tetszőleges kombinációiból állnak, és a részletek megszerzéséhez a dokumentációra kell hivatkoznia. A kérelem feldolgozása során ismernie kell ezt a formátumot, amely végpontról végpontra változik.
A GraphQL nem támaszkodik olyan HTTP igékre, mint a POST, GET, PUT és DELETE, hogy CRUD műveleteket hajtson végre a szerveren. Ehelyett csak egyetlen típusú HTTP kérés típus és endopint létezik az összes CRUD-hoz kapcsolódó művelethez. A GitHub esetében ez POST típusú kéréseket tartalmaz, csak egy végponttal: https: // api.github.com / graphql
POST kérésként magában hordozhat egy JSON-szerű szövegtestet, amelyen keresztül a GraphQL műveleteink lesznek. Ezek a műveletek tipea típusúak lehetnek lekérdezés ha csak annyit akar elolvasni néhány információt, vagy lehet a mutáció abban az esetben, ha az adatokat módosítani kell.
GraphQL API hívások kezdeményezéséhez használhatja a GitHub GraphQL explorerjét. Vessen egy pillantást erre a GraphQL-re lekérdezés ugyanolyan típusú adatok (a felhasználó nyilvános életrajza) beolvasására, mint a fentiekben a REST használatával.
Kérés: POST https: // api.github.com / graphqllekérdezés
felhasználó (bejelentkezés: "ranvo")
bio
Válasz:
"adatok":
"felhasználó":
"bio": "Műszaki és tudományos rajongók. Mindenféle független dologgal foglalkozom
szerverek a kvantumfizikához.\ r \ nElőfordulva blogbejegyzéseket írok a fenti érdeklődési körökről."
Mint látható, a válasz csak abból áll, amit kért, ez a felhasználó életrajza. Kiválaszt egy adott felhasználót a felhasználónév átadásával (az én esetemben ez az ranvo), majd megkérdezi az adott felhasználó attribútumának értékét, ebben az esetben ez az attribútum bio. Az API-kiszolgáló megkeresi a pontos információkat, és ezzel válaszol, semmi mással.
A fordított oldalon a GraphQL azt is tenné, hogy egyetlen kérést küldene, és kivonja azokat az információkat, amelyek több kérést is igényeltek volna a hagyományos REST API-ban. Emlékezzünk arra, hogy az összes GraphQL-kérés csak egy API-végponthoz érkezik. Vegyük például azt a felhasználási esetet, amikor a GitHub API szervertől kell megkérdezni a felhasználó életrajzát és annak egyik SSH kulcsát. Két GET-kérésre lenne szükség.
REST kérések: GET https: // api.github.com /GET https: // api.github.com /
GraphQL kérés: POST https: // api.github.com / graphql /
lekérdezés
felhasználó (bejelentkezés: "ranvo")
bio
publicKeys (utolsó: 1)
élek
csomópont
kulcs
GraphQL válasz:
"adatok":
"felhasználó":
"bio": "Műszaki és tudományos rajongók. Mindenféle független dologgal foglalkozom
szerverek a kvantumfizikához.\ r \ nElőfordulva blogbejegyzéseket írok a fenti érdeklődési körökről.",
"publicKeys":
"élek": [
"csomópont":
"kulcs": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH31mVjRYdzeh8oD8jvaFpRuIgL65SwILyKpeGBUNGOT"
]
Vannak beágyazott objektumok, de ha megnézed a kérésedet, nagyjából megfelelnek a kérésednek, így megismerheted és bizonyos értelemben alakíthatod a kapott válasz szerkezetét .
Következtetés
A GraphQL saját tanulási görbével rendelkezik, amely nagyon meredek, vagy egyáltalán nem meredek attól függően, hogy kit kérdez. Objektív szempontból a következő tényeket fogalmazhatom meg Önnek. Rugalmas, amint azt fentebb látta, introspektív - vagyis lekérdezheti a GraphQL API-t magáról az API-ról. Még akkor is, ha nem az API-kiszolgálót fogja használni azzal, valószínű, hogy olyan API-val kell majd csatlakoznia, amely csak a GraphQL-t engedélyezi.
Itt többet megtudhat a technikájáról, és ha helyi munkaállomáson szeretne GraphQL API-hívásokat kezdeményezni, akkor használja a Graphiql-t.