REST API

REST API vs GraphQL

REST API vs GraphQL

TL; DR-version

I ett av de tidigare inläggen diskuterade vi kortfattat hur det är att använda GitHub API v3. Den här versionen är utformad för gränssnitt som alla andra REST API. Det finns slutpunkter för varje resurs som du behöver för att komma åt och / eller ändra. Det finns slutpunkter för varje användare, varje organisation, varje arkiv och så vidare. Till exempel har varje användare sin API-slutpunkt på https: // api.github.com / användare / du kan prova att ersätta ditt användarnamn istället för och ange webbadressen i en webbläsare för att se vad API: et svarar på.

GitHub API v4 använder å andra sidan GraphQL där QL står för Query Language. GraphQL är ett nytt sätt att designa dina API: er. Precis som det finns många webbtjänster som erbjuds som REST-API: er, inte bara de som erbjuds av GitHub, det finns många webbtjänster som gör att du kan ansluta till dem via GraphQL.

Den starkaste skillnaden du kommer att märka mellan GraphQL och REST API är att GraphQL kan fungera från en enda API-slutpunkt. I fallet med GitHub API v4 är denna slutpunkt https: // api.github.com / graphql och det är det. Du behöver inte oroa dig för att lägga till långa strängar i slutet av en rot-URI eller ange en frågesträngsparameter för extra information. Du skickar helt enkelt ett JSON-liknande argument till detta API och ber bara om de saker du behöver och du får tillbaka en JSON-nyttolast med exakt samma information som du begärde. Du behöver inte ta itu med att filtrera bort oönskad information eller drabbas av prestandakostnader på grund av stora svar.

Vad är REST API?

Tja, REST står för Representational State Transfer och API står för Application Programming Interface. Ett REST API, eller ett 'RESTful' API, har blivit kärnan i designfilosofin bakom de flesta moderna klient-serverapplikationer. Idén framgår av behovet av att separera olika komponenter i en applikation som klientsidans gränssnitt och serversidan logik.

Så sessionen mellan en klient och en server är vanligtvis statslös. När webbsidan och relaterade skript har laddats kan du fortsätta att interagera med dem och när du utför en åtgärd (som att trycka på en skicka-knapp) skickas en skicka begäran tillsammans med all kontextuell information som webbservern behöver för att behandla den begäran som användarnamn, tokens, etc). Applikationen övergår från ett tillstånd till ett annat men utan ett konstant behov av anslutning mellan klienten och servern.

REST definierar en uppsättning begränsningar mellan klienten och servern, och kommunikationen kan bara ske under dessa begränsningar. Till exempel använder REST over HTTP vanligtvis CRUD-modellen, som står för Create, Read, Update and Delete och HTTP-metoder som POST, GET, PUT och DELETE hjälper dig att utföra dessa operationer och dessa operationer ensam. Gamla intrångstekniker som SQL-injektioner är inte en möjlighet med något som ett noggrant skrivet REST API (även om det är REST är inte ett säkerhetsmedel).

Det hjälper också UI-utvecklare ganska mycket! Eftersom allt du får från en HTTP-förfrågan är typiskt en textström (formaterad som JSON, ibland) kan du enkelt implementera en webbsida för webbläsare eller en app (på ditt föredragna språk) utan att oroa dig för serverns arkitektur. Du läser API-dokumentationen för tjänster som Reddit, Twitter eller Facebook och du kan skriva tillägg för dem eller tredjepartsklienter på det språk du väljer eftersom du är garanterad att API: s beteende fortfarande kommer att vara detsamma.

Omvänt bryr sig inte servern om front-end är skrivet i Go, Ruby eller Python. Oavsett om det är en webbläsare, app eller en CLI. Det "ser" bara begäran och svarar på lämpligt sätt.

Vad är GraphQL?

Som med allt i datorvärlden blev REST API: er större och mer komplexa och samtidigt ville människor implementera och konsumera dem på ett snabbare och enklare sätt. Det är därför Facebook kom med idén om GraphQL och senare öppnade den. QL i GraphQL står för Query Language.

GraphQL tillåter kunder att göra mycket specifika API-förfrågningar istället för att göra rigida API-samtal med fördefinierade parametrar och svar. Det är mycket enklare eftersom servern sedan svarar med exakt de data som du bad om, utan något överskott.

Ta en titt på denna REST-begäran och dess motsvarande svar. Denna begäran är avsedd att bara visa en användares offentliga bio.

Begäran: Hämta https: // api.github.com / användare /
Svar:

"login": "octocat",
"id": 583231,
"node_id": "MDQ6VXNlcjU4MzIzMQ ==",
"avatar_url": "https: // avatars3.githubusercontent.com / u / 583231?v = 4 ",
"gravatar_id": "",
"url": "https: // api.github.com / användare / octocat ",
"html_url": "https: // github.com / octocat ",
"followers_url": "https: // api.github.com / användare / octocat / följare ",
"following_url": "https: // api.github.com / användare / octocat / följer / other_user ",
"gists_url": "https: // api.github.com / användare / octocat / gists / gist_id ",
"starred_url": "https: // api.github.com / users / octocat / starred / owner / repo ",
"subscriptions_url": "https: // api.github.com / användare / octocat / prenumerationer ",
"organisations_url": "https: // api.github.com / användare / octocat / orgs ",
"repos_url": "https: // api.github.com / användare / octocat / repos ",
"events_url": "https: // api.github.com / användare / octocat / händelser / privacy ",
"received_events_url": "https: // api.github.com / användare / octocat / mottagna_events ",
"type": "User",
"site_admin": falskt,
"name": "The Octocat",
"company": "GitHub",
"blogg": "http: // www.github.com / blogg ",
"location": "San Francisco",
"e-post": null,
"anställningsbar": null,
"bio": null,
"public_repos": 8,
"public_gists": 8,
"följare": 2455,
"följande": 9,
"created_at": "2011-01-25T18: 44: 36Z",
"updated_at": "2018-11-22T16: 00: 23Z"

Jag har använt användarnamnet octocat, men du kan ersätta det med det användarnamn du väljer och använda cURL för att göra denna begäran i kommandoraden eller Postman om du behöver ett GUI. Medan förfrågan var enkel, tänk på all extra information du får från det här svaret. Om du skulle bearbeta data från en miljon sådana användare och filtrera bort all onödig data med hjälp av det är inte effektivt. Du slösar bort bandbredd, minne och beräkning för att hämta, lagra och filtrera bort alla de miljoner extra nyckel-värdepar som du aldrig kommer att göra

Svarets struktur är inte något du känner till i förväg. Detta JSON-svar motsvarar ordlistobjekt i Python eller ett objekt i JavaScript. Andra slutpunkter svarar med JSON-objekt som kan bestå av kapslade objekt, kapslad lista i objektet eller någon godtycklig kombination av JSON-datatyper, och du måste läsa dokumentationen för att få detaljerna. När du behandlar begäran måste du vara medveten om detta format som ändras från slutpunkt till slutpunkt.

GraphQL förlitar sig inte på HTTP-verb som POST, GET, PUT och DELETE för att utföra CRUD-operationer på servern. Istället finns det bara en typ av HTTP-begäranstyp och endopint för alla CRUD-relaterade operationer. I fallet med GitHub innebär detta förfrågningar av typen POST med endast en slutpunkt https: // api.github.com / graphql

Som en POST-begäran kan den bära med sig en JSON-liknande texttext genom vilken vår GraphQL-verksamhet kommer att vara. Dessa operationer kan vara av typea fråga om allt det vill göra är att läsa lite information, eller så kan det vara en mutation om data behöver ändras.

För att ringa GraphQL API-samtal kan du använda GitHubs GraphQL-utforskare. Ta en titt på denna GraphQL fråga att hämta samma typ av data (en användares offentliga bio) som vi gjorde ovan med REST.

Förfrågan: POST https: // api.github.com / graphql
fråga
användare (inloggning: "ranvo")
bio


 
Svar:
 

"data":
"användare":
"bio": "Tech- och vetenskapsentusiaster. Jag gillar alla slags orelaterade saker från
servrar till kvantfysik.\ r \ n Ibland skriver jag blogginlägg om ovanstående intressen."


Som du kan se består svaret bara av det du bad om, det är användarens bio. Du väljer en specifik användare genom att skicka användarnamnet (i mitt fall är det ranvo) och sedan ber du om värdet på ett attribut för den användaren, i det här fallet är attributet bio. API-servern letar upp den exakta specifika informationen och svarar med det och ingenting annat.

På baksidan låter GraphQL dig också göra en enda begäran och extrahera information som skulle ha tagit dig flera förfrågningar i traditionellt REST API. Kom ihåg att alla GraphQL-förfrågningar görs till endast ett API-slutpunkt. Ta till exempel användningsfallet där du behöver be GitHub API-servern om användarens bio och en av dess SSH-nycklar. Det skulle kräva två GET-resquests.

REST-begäranden: Hämta https: // api.github.com //
Hämta https: // api.github.com // tangenter
 
GraphQL-begäran: POST https: // api.github.com / graphql /
 
fråga
användare (inloggning: "ranvo")
bio
publicKeys (sista: 1)
kanter
nod
nyckel-





 
GraphQL-svar:
 

"data":
"användare":
"bio": "Tech- och vetenskapsentusiaster. Jag gillar alla slags orelaterade saker från
servrar till kvantfysik.\ r \ n Ibland skriver jag blogginlägg om ovanstående intressen.",
"publicKeys":
"kanter": [

"nod":
"key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH31mVjRYdzeh8oD8jvaFpRuIgL65SwILyKpeGBUNGOT"


]



Det finns kapslade objekt, men om du tittar på din förfrågan matchar de ganska mycket din begäran så att du kan veta och på något sätt forma strukturen för svaret du får .

Slutsats

GraphQL har sin egen inlärningskurva, som är väldigt brant eller inte brant alls beroende på vem det är som du frågar. Ur objektiv synvinkel kan jag lägga fram följande fakta åt dig. Det är flexibelt som du har sett ovan, det är introspektivt - det vill säga du kan fråga GraphQL API om själva API: t. Även om du inte ska bygga din API-server med den är chansen stor att du måste ansluta till ett API som endast tillåter GraphQL.

Du kan lära dig lite mer om dess tekniska egenskaper här och om du vill ringa GraphQL API-samtal från din lokala arbetsstation använder du Graphiql.

SuperTuxKart för Linux
SuperTuxKart är en fantastisk titel som är utformad för att ge dig Mario Kart-upplevelsen gratis på ditt Linux-system. Det är ganska utmanande och rol...
Battle for Wesnoth Tutorial
Slaget om Wesnoth är ett av de mest populära open source-strategispel som du kan spela just nu. Det här spelet har inte bara utvecklats under mycket l...
0 A.D. Handledning
Av de många strategispelen där ute, 0 A.D. lyckas framstå som en omfattande titel och ett mycket djupt, taktiskt spel trots att det är öppen källkod. ...