REST API

REST API vs GraphQL

REST API vs GraphQL

TL; DR version

I et af de tidligere indlæg diskuterede vi kort fortalt, hvordan det er at bruge GitHub API v3. Denne version er designet til at være grænseflader som enhver anden REST API. Der er slutpunkter for hver ressource, som du har brug for for at få adgang til og / eller ændre. Der er slutpunkter for hver bruger, hver organisation, hvert arkiv og så videre. For eksempel har hver bruger sit API-slutpunkt på https: // api.github.com / brugere / du kan prøve at erstatte dit brugernavn i stedet for og indtast URL'en i en browser for at se, hvad API'en reagerer med.

GitHub API v4 bruger derimod GraphQL, hvor QL står for Query Language. GraphQL er en ny måde at designe dine API'er på. Ligesom der er mange webtjenester, der tilbydes som REST API'er, ikke kun dem, der tilbydes af GitHub, er der mange webtjenester, der giver dig mulighed for at grænseflade med dem via GraphQL.

Den stærkeste forskel, du vil bemærke mellem GraphQL og REST API, er, at GraphQL kan fungere ud fra et enkelt API-slutpunkt. I tilfælde af GitHub API v4 er dette slutpunkt https: // api.github.com / graphql og det er det. Du behøver ikke bekymre dig om at tilføje lange strenge i slutningen af ​​en root-URI eller angive en forespørgselsstrengparameter for ekstra information. Du sender simpelthen et JSON-lignende argument til denne API og beder kun om de ting, du har brug for, og du får en JSON-nyttelast tilbage med nøjagtig den samme information, som du har anmodet om. Du behøver ikke beskæftige dig med at filtrere uønskede oplysninger ud eller lide af performance overhead på grund af store svar.

Hvad er REST API?

Nå, REST står for Representational State Transfer og API står for Application Programming Interface. En REST API eller en 'RESTful' API er blevet den centrale designfilosofi bag de fleste moderne klient-server applikationer. Idéen fremgår af behovet for at adskille forskellige komponenter i en applikation som klientsiden UI og serversides logik.

Så sessionen mellem en klient og en server er typisk statsløs. Når websiden og relaterede scripts er indlæst, kan du fortsætte med at interagere med dem, og når du udfører en handling (som at trykke på en sendeknap), sendes en sendeanmodning sammen med alle de kontekstuelle oplysninger, som webserveren har brug for til at behandle den anmodning ( som brugernavn, tokens osv.). Applikationen overgår fra en tilstand til en anden, men uden et konstant behov for forbindelse mellem klienten og serveren.

REST definerer et sæt begrænsninger mellem klienten og serveren, og kommunikationen kan kun ske under disse begrænsninger. For eksempel bruger REST over HTTP normalt CRUD-modellen, som står for Opret, læse, opdatere og slette og HTTP-metoder som POST, GET, PUT og DELETE hjælper dig med at udføre disse operationer og disse operationer alene. Gamle indtrængningsteknikker som SQL-injektioner er ikke en mulighed med noget som en tæt skrevet REST API (selvom det er REST, er det ikke et sikkerhedsmiddel).

Det hjælper også UI-udviklere ret meget! Da alt, hvad du modtager fra en HTTP-anmodning, typisk er en strøm af tekst (formateret som JSON, nogle gange), kan du nemt implementere en webside til browsere eller en app (på dit foretrukne sprog) uden at bekymre dig om serversides arkitektur. Du læser API-dokumentationen for tjenester som Reddit, Twitter eller Facebook, og du kan skrive udvidelser til dem eller tredjepartsklienter på det valgte sprog, da du er garanteret, at API'ens opførsel stadig vil være den samme.

Omvendt er serveren ligeglad med, om front-end er skrevet i Go, Ruby eller Python. Uanset om det er en browser, app eller en CLI. Det 'bare' ser anmodningen og svarer passende.

Hvad er GraphQL?

Som med alt andet inden for computeren blev REST API'er større og mere komplekse, og på samme tid ville folk implementere og forbruge dem på en hurtigere og enklere måde. Dette er grunden til, at Facebook kom op med ideen om GraphQL og senere åbnede den. QL i GraphQL står for Query Language.

GraphQL giver klienter mulighed for at foretage meget specifikke API-anmodninger i stedet for at foretage stive API-opkald med foruddefinerede parametre og svar. Det er meget mere simpelt, fordi serveren derefter reagerer med nøjagtigt de data, som du bad om, uden noget overskud.

Se på denne REST-anmodning og dens tilsvarende svar. Denne anmodning er beregnet til kun at se en brugers offentlige biografi.

Anmodning: FÅ https: // api.github.com / brugere /
Respons:

"login": "octocat",
"id": 583231,
"node_id": "MDQ6VXNlcjU4MzIzMQ ==",
"avatar_url": "https: // avatars3.githubusercontent.com / u / 583231?v = 4 ",
"gravatar_id": "",
"url": "https: // api.github.com / brugere / octocat ",
"html_url": "https: // github.com / octocat ",
"followers_url": "https: // api.github.com / brugere / octocat / tilhængere ",
"following_url": "https: // api.github.com / brugere / octocat / følger / other_user ",
"gists_url": "https: // api.github.com / brugere / octocat / gists / gist_id ",
"starred_url": "https: // api.github.com / brugere / octocat / stjernemarkeret / ejer / repo ",
"subscriptions_url": "https: // api.github.com / brugere / octocat / abonnementer ",
"organisations_url": "https: // api.github.com / brugere / octocat / orgs ",
"repos_url": "https: // api.github.com / brugere / octocat / repos ",
"events_url": "https: // api.github.com / brugere / octocat / begivenheder / privacy ",
"received_events_url": "https: // api.github.com / brugere / octocat / modtaget_events ",
"type": "Bruger",
"site_admin": falsk,
"name": "The Octocat",
"company": "GitHub",
"blog": "http: // www.github.com / blog ",
"location": "San Francisco",
"e-mail": null,
"lejelig": null,
"bio": null,
"public_repos": 8,
"public_gists": 8,
"tilhængere": 2455,
"følgende": 9,
"created_at": "2011-01-25T18: 44: 36Z",
"updated_at": "2018-11-22T16: 00: 23Z"

Jeg har brugt brugernavnet octocat, men du kan erstatte det med det brugernavn, du vælger, og bruge cURL til at stille denne anmodning i kommandolinjen eller Postbrevet, hvis du har brug for en GUI. Mens anmodningen var enkel, så tænk over alle de ekstra oplysninger, du får fra dette svar. Hvis du skulle behandle data fra en million sådanne brugere og filtrere alle unødvendige data ud ved hjælp af det, er det ikke effektivt. Du spilder båndbredde, hukommelse og beregning ved at hente, gemme og filtrere alle de millioner ekstra nøgleværdipar, som du aldrig vil dig

Svarets struktur er heller ikke noget, du kender på forhånd. Dette JSON-svar svarer til ordbogobjektet i Python eller et objekt i JavaScript. Andre slutpunkter reagerer med JSON-objekter, der kan være sammensat af indlejrede objekter, indlejret liste i objektet eller en vilkårlig kombination af JSON-datatyper, og du bliver nødt til at henvise til dokumentationen for at få detaljerne. Når du behandler anmodningen, skal du være opmærksom på dette format, der skifter fra slutpunkt til slutpunkt.

GraphQL stoler ikke på HTTP-verb som POST, GET, PUT og DELETE for at udføre CRUD-operationer på serveren. I stedet er der kun en type HTTP-anmodningstype og endopint til alle CRUD-relaterede operationer. I tilfælde af GitHub involverer dette anmodninger af typen POST med kun et slutpunkt https: // api.github.com / graphql

Som en POST-anmodning kan den bære en JSON-lignende teksttekst, hvorigennem vores GraphQL-operationer vil være. Disse operationer kan være af typen forespørgsel hvis alt det vil gøre er at læse nogle oplysninger, eller det kan være en mutation hvis data skal ændres.

For at foretage GraphQL API-opkald kan du bruge GitHubs GraphQL explorer. Se på denne GraphQL forespørgsel at hente den samme type data (en brugers offentlige bio) som vi gjorde ovenfor ved hjælp af REST.

Anmodning: POST https: // api.github.com / graphql
forespørgsel
bruger (login: "ranvo")
bio


 
Respons:
 

"data":
"bruger":
"bio": "Tech- og videnskabsentusiaster. Jeg er interesseret i alle mulige slags ikke-relaterede ting fra
servere til kvantefysik.\ r \ n Lejlighedsvis skriver jeg blogindlæg om ovenstående interesser."


Som du kan se, består svaret kun af det, du bad om, det er brugerens biografi. Du vælger en bestemt bruger ved at videregive brugernavnet (i mit tilfælde er det ranvo) og derefter beder du om værdien af ​​en attribut for den bruger, i dette tilfælde er den attribut bio. API-serveren ser de nøjagtige specifikke oplysninger op og reagerer med det og intet andet.

På bagsiden, lad GraphQL dig også lave en enkelt anmodning og udtrække oplysninger, der ville have taget dig flere anmodninger i traditionel REST API. Husk, at alle GraphQL-anmodninger kun foretages til et API-slutpunkt. Tag for eksempel brugssagen, hvor du har brug for at bede GitHub API-serveren om brugerens biografi og en af ​​dens SSH-nøgler. Det ville kræve to GET-gendannelser.

REST-anmodninger: FÅ https: // api.github.com //
FÅ https: // api.github.com // taster
 
GraphQL-anmodning: POST https: // api.github.com / graphql /
 
forespørgsel
bruger (login: "ranvo")
bio
publicKeys (sidste: 1)
kanter
knudepunkt
nøgle





 
GraphQL-svar:
 

"data":
"bruger":
"bio": "Tech- og videnskabsentusiaster. Jeg er interesseret i alle mulige slags ikke-relaterede ting fra
servere til kvantefysik.\ r \ n Lejlighedsvis skriver jeg blogindlæg om ovenstående interesser.",
"publicKeys":
"kanter": [

"node":
"nøgle": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH31mVjRYdzeh8oD8jvaFpRuIgL65SwILyKpeGBUNGOT"


]



Der er indlejrede genstande, men hvis du ser på din anmodning, matcher de stort set din anmodning, så du kan kende og på en eller anden måde forme strukturen på det svar, du får .

Konklusion

GraphQL kommer med sin egen indlæringskurve, som er meget stejl eller slet ikke stejl afhængigt af hvem det er, du spørger. Fra et objektivt synspunkt kan jeg lægge følgende fakta for dig. Det er fleksibelt som du har set ovenfor, det er introspektivt - det vil sige, du kan spørge GraphQL API om selve API'en. Selvom du ikke vil bygge din API-server ved hjælp af den, er chancerne for, at du bliver nødt til at grænseflade med en API, der kun tillader GraphQL.

Du kan lære lidt mere om dets tekniske egenskaber her, og hvis du vil foretage GraphQL API-opkald fra din lokale arbejdsstation, skal du bruge Graphiql.

Sådan installeres og afspilles Doom på Linux
Introduktion til undergang Doom-serien opstod i 90'erne efter frigivelsen af ​​den originale Doom. Det var et øjeblikkeligt hit, og fra den tid af har...
Vulkan til Linux-brugere
Med hver nye generation af grafikkort ser vi spiludviklere skubbe grænserne for grafisk troskab og komme et skridt tættere på fotorealisme. Men på tro...
OpenTTD vs Simutrans
Oprettelse af din egen transportsimulering kan være sjovt, afslappende og ekstremt lokkende. Derfor skal du sørge for at prøve så mange spil som mulig...