REST API

REST API vs GraphQL

REST API vs GraphQL

TL; DR-versjon

I et av de forrige innleggene diskuterte vi kort fortalt hvordan det er å bruke GitHub API v3. Denne versjonen er designet for å være grensesnitt som alle andre REST API. Det er endepunkter for hver ressurs du trenger for å få tilgang til og / eller endre. Det er sluttpunkter for hver bruker, hver organisasjon, hvert depot og så videre. For eksempel har hver bruker sitt API-sluttpunkt på https: // api.github.com / brukere / du kan prøve å erstatte brukernavnet ditt i stedet for og skriv inn URL-en i en nettleser for å se hva API-en reagerer på.

GitHub API v4 bruker derimot GraphQL der QL står for Query Language. GraphQL er en ny måte å designe APIene dine på. Akkurat som det er mange webtjenester som tilbys som REST APIer, ikke bare de som tilbys av GitHub, er det mange webtjenester som lar deg grensesnitt med dem via GraphQL.

Den sterkeste forskjellen du vil merke mellom GraphQL og REST API er at GraphQL kan fungere av et enkelt API-endepunkt. I tilfelle av GitHub API v4 er dette sluttpunktet https: // api.github.com / graphql og det er det. Du trenger ikke å bekymre deg for å legge til lange strenger på slutten av en rot-URI eller oppgi en spørringsstrengparameter for ekstra informasjon. Du sender ganske enkelt et JSON-lignende argument til dette API-et, og ber bare om de tingene du trenger, og du vil få en JSON-nyttelast tilbake med nøyaktig samme informasjon som du ba om. Du trenger ikke å forholde deg til å filtrere ut uønsket informasjon, eller lider av ytelsesomkostninger på grunn av store svar.

Hva er REST API?

Vel, REST står for Representational State Transfer og API står for Application Programming Interface. En REST API, eller en 'RESTful' API, har blitt den viktigste designfilosofien bak de fleste moderne klientserverapplikasjoner. Ideen kommer fra behovet for å adskille ulike komponentene i en applikasjon som klient-side UI og server-side logikk.

Så økten mellom en klient og en server er vanligvis statsløs. Når nettsiden og relaterte skript er lastet inn, kan du fortsette å samhandle med dem, og når du utfører en handling (som å trykke på en send-knapp), sendes en sendeforespørsel sammen med all kontekstuell informasjon som webserveren trenger for å behandle forespørselen ( som brukernavn, tokens osv.). Applikasjonen overgår fra en tilstand til en annen, men uten et konstant behov for forbindelse mellom klienten og serveren.

REST definerer et sett med begrensninger mellom klienten og serveren, og kommunikasjonen kan bare skje under disse begrensningene. For eksempel bruker REST over HTTP vanligvis CRUD-modellen, som står for Create, Read, Update and Delete og HTTP-metoder som POST, GET, PUT og DELETE hjelper deg med å utføre disse operasjonene og disse operasjonene alene. Gamle innbruddsteknikker som SQL-injeksjoner er ikke en mulighet med noe som en tett skrevet REST API (selv om det er REST er ikke et sikkerhetsmiddel).

Det hjelper også UI-utviklere ganske mye! Siden alt du mottar fra en HTTP-forespørsel, er typisk en tekststrøm (formatert som JSON, noen ganger), kan du enkelt implementere en webside for nettlesere eller en app (på ditt foretrukne språk) uten å bekymre deg for serverarkitekturen. Du leser API-dokumentasjonen for tjenester som Reddit, Twitter eller Facebook, og du kan skrive utvidelser for dem eller tredjepartsklienter på det valgte språket, siden du er garantert at API-oppførselen fremdeles vil være den samme.

Omvendt bryr serveren seg ikke om front-enden er skrevet i Go, Ruby eller Python. Enten det er en nettleser, app eller en CLI. Den bare ser forespørselen og svarer riktig.

Hva er GraphQL?

Som med alt i datamaskinverdenen, ble REST APIer større og mer komplekse, og samtidig ønsket folk å implementere og konsumere dem på en raskere og enklere måte. Dette var grunnen til at Facebook kom på ideen om GraphQL, og senere åpnet den. QL i GraphQL står for Query Language.

GraphQL tillater klienter å gjøre veldig spesifikke API-forespørsler, i stedet for å ringe API-anrop med forhåndsdefinerte parametere og svar. Det er mye enklere fordi serveren da svarer med nøyaktig dataene du ba om, uten noe overskudd.

Ta en titt på denne REST-forespørselen og dens tilsvarende svar. Denne forespørselen er ment å vise bare brukerens offentlige biografi.

Forespørsel: FÅ https: // api.github.com / brukere /
Respons:

"login": "octocat",
"id": 583231,
"node_id": "MDQ6VXNlcjU4MzIzMQ ==",
"avatar_url": "https: // avatars3.githubusercontent.com / u / 583231?v = 4 ",
"gravatar_id": "",
"url": "https: // api.github.no / brukere / octocat ",
"html_url": "https: // github.com / octocat ",
"followers_url": "https: // api.github.no / brukere / octocat / følgere ",
"following_url": "https: // api.github.no / brukere / octocat / følger / other_user ",
"gists_url": "https: // api.github.no / brukere / octocat / gists / gist_id ",
"starred_url": "https: // api.github.no / brukere / octocat / stjernemerket / owner / repo ",
"subscriptions_url": "https: // api.github.no / brukere / octocat / abonnementer ",
"organisasjoner_url": "https: // api.github.no / brukere / octocat / organisasjoner ",
"repos_url": "https: // api.github.no / brukere / octocat / repos ",
"events_url": "https: // api.github.no / brukere / octocat / hendelser / privacy ",
"received_events_url": "https: // api.github.no / brukere / octocat / mottatt_events ",
"type": "Bruker",
"site_admin": false,
"name": "The Octocat",
"company": "GitHub",
"blogg": "http: // www.github.com / blogg ",
"location": "San Francisco",
"e-post": null,
"ansettbar": null,
"bio": null,
"public_repos": 8,
"public_gists": 8,
"følgere": 2455,
"følgende": 9,
"created_at": "2011-01-25T18: 44: 36Z",
"updated_at": "2018-11-22T16: 00: 23Z"

Jeg har brukt brukernavnet octocat, men du kan erstatte det med brukernavnet du ønsker og bruke cURL for å gjøre denne forespørselen i kommandolinjen eller Postman hvis du trenger en GUI. Mens forespørselen var enkel, bør du tenke på all ekstra informasjon du får fra dette svaret. Hvis du skulle behandle data fra en million slike brukere og filtrere ut alle unødvendige data ved hjelp av det, er det ikke effektivt. Du kaster bort båndbredde, minne og beregning for å få, lagre og filtrere bort alle de millioner ekstra nøkkelverdiparene du aldri vil gi deg

Også strukturen i responsen er ikke noe du vet på forhånd. Dette JSON-svaret tilsvarer ordbokobjektet i Python, eller et objekt i JavaScript. Andre endepunkter vil svare med JSON-objekter som kan være sammensatt av nestede objekter, nestet liste i objektet eller en vilkårlig kombinasjon av JSON-datatyper, og du må referere til dokumentasjonen for å få detaljene. Når du behandler forespørselen, må du være oppmerksom på dette formatet som endres fra sluttpunkt til sluttpunkt.

GraphQL stoler ikke på HTTP-verb som POST, GET, PUT og DELETE for å utføre CRUD-operasjoner på serveren. I stedet er det bare en type HTTP-forespørselstype og endopint for alle CRUD-relaterte operasjoner. I tilfelle av GitHub involverer dette forespørsler av typen POST med bare ett sluttpunkt https: // api.github.com / graphql

Å være en POST-forespørsel kan den bære med seg en JSON-lignende teksttekst som vil være vår GraphQL-operasjon. Disse operasjonene kan være av typen spørsmål hvis alt det vil gjøre er å lese litt informasjon, eller det kan være en mutasjon i tilfelle data må endres.

For å foreta GraphQL API-samtaler kan du bruke GitHubs GraphQL explorer. Ta en titt på denne GraphQL spørsmål å hente samme type data (en brukers offentlige biografi) som vi gjorde ovenfor ved hjelp av REST.

Forespørsel: POST https: // api.github.com / graphql
spørsmål
bruker (pålogging: "ranvo")
bio


 
Respons:
 

"data":
"bruker":
"bio": "Tech- og vitenskapsentusiaster. Jeg er interessert i alle slags urelaterte ting fra
servere til kvantefysikk.\ r \ n Innimellom skriver jeg blogginnlegg om interessene ovenfor."


Som du kan se, består svaret bare av det du ba om, det er brukerens biografi. Du velger en bestemt bruker ved å sende brukernavnet (i mitt tilfelle er det det ranvo) og så ber du om verdien av et attributt til den brukeren, i dette tilfellet er attributtet bio. API-serveren ser opp den nøyaktige spesifikke informasjonen og svarer med det og ingenting annet.

På baksiden lar GraphQL deg også lage en enkelt forespørsel og trekke ut informasjon som ville ha tatt deg flere forespørsler i tradisjonell REST API. Husk at alle GraphQL-forespørsler bare gjøres til ett API-endepunkt. Ta for eksempel brukssaken der du trenger å be GitHub API-serveren om brukerens bio og en av SSH-nøklene. Det vil kreve to GET-undersøkelser.

REST-forespørsler: FÅ https: // api.github.com //
FÅ https: // api.github.com // tastene
 
GraphQL-forespørsel: POST https: // api.github.com / graphql /
 
spørsmål
bruker (pålogging: "ranvo")
bio
publicKeys (siste: 1)
kanter
node
nøkkel





 
Svar fra GraphQL:
 

"data":
"bruker":
"bio": "Teknologi- og vitenskapentusiaster. Jeg er interessert i alle slags urelaterte ting fra
servere til kvantefysikk.\ r \ n Av og til skriver jeg blogginnlegg om interessene ovenfor.",
"publicKeys":
"kanter": [

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


]



Det er nestet objekt, men hvis du ser på forespørselen din, samsvarer de ganske mye med forespørselen din, slik at du kan vite og på en eller annen måte forme strukturen til svaret du får .

Konklusjon

GraphQL kommer med sin egen læringskurve, som er veldig bratt, eller ikke bratt i det hele tatt, avhengig av hvem det er du spør. Fra et objektivt synspunkt kan jeg legge følgende fakta for deg. Det er fleksibelt som du har sett ovenfor, det er introspektivt - det vil si at du kan spørre GraphQL API om selve API-en. Selv om du ikke skal bygge API-serveren din ved å bruke den, er sjansen stor for at du må grensesnitt med en API som bare tillater GraphQL.

Du kan lære litt mer om dets tekniske egenskaper her, og hvis du vil ringe GraphQL API-samtaler fra din lokale arbeidsstasjon, så bruk Graphiql.

Beste Linux Distros for spill i 2021
Linux-operativsystemet har kommet langt fra det originale, enkle, serverbaserte utseendet. Dette operativsystemet har forbedret seg enormt de siste år...
Hvordan fange opp og streame spilløkten din på Linux
Tidligere ble spill bare ansett som en hobby, men med tiden så spillindustrien en enorm vekst når det gjelder teknologi og antall spillere. Spillpubli...
Beste spill å spille med håndsporing
Oculus Quest introduserte nylig den gode ideen om håndsporing uten kontrollere. Med et stadig økende antall spill og aktiviteter som utfører støtte en...