GraphQL-handledning för nybörjare: Vad är, funktioner och exempel

⚡ Smart sammanfattning

GraphQL är ett serversidesfrågespråk som låter en klient begära exakt den data den behöver i ett enda anrop. Den här sidan förklarar dess viktigaste komponenter, frågor, variabler, mutationer, prenumerationer och hur det skiljer sig från REST.

  • 🧠 Definition: GraphQL är en applikationslagerteknik som kör deklarativa frågor mot befintlig data.
  • 🧩 Nyckelkomponenter: En fråga begär data, en resolver hämtar den och ett schema definierar vad som kan efterfrågas.
  • 🎯 Enskilt samtal: En begäran returnerar varje obligatoriskt fält, vilket eliminerar överhämtning och underhämtning.
  • 🔤 variabler: Dynamiska värden deklareras separat och skickas som en ordlista snarare än att byggas in i frågesträngen.
  • ✏️ Mutationer: En mutation infogar, uppdaterar eller tar bort data och returnerar det modifierade värdet.
  • 📡 Prenumerationer: En prenumeration håller en anslutning öppen så att servern skickar uppdateringar allt eftersom de sker.
  • ⚖️ Mot REST: GraphQL är klientdrivet och schemabaserat, medan REST är serverdrivet och endpoint-baserat.

GraphQL-handledning för nybörjare

Vad är GraphQL?

GraphQL är en serversidesteknik för applikationslagret som utvecklades av Facebook, numera Meta, för att köra frågor med befintlig data. Den släpptes offentligt 2015 och har styrts av GraphQL. Foundation sedan 2018. GraphQL kan optimera RESTful API-anrop. Det ger ett deklarativt sätt att hämta och uppdatera dina data. GraphQL hjälper dig att ladda data från server till klient. Det gör det möjligt för programmerare att välja vilka typer av förfrågningar de vill göra.

Vad behöver du lära dig innan du lär dig GraphQL?

Denna GraphQL-handledning är baserad på uttrycka och NodeJs. Därför kan du lära dig GraphQL mycket enkelt med en grundläggande förståelse för NodeJS.

Varför använda GraphQL?

Följande är anledningarna till att använda GraphQL:

  • Det ger en läsbar fråga.
  • I GraphQL är det mycket enkelt att hantera många databaser.
  • Den är lämplig för mikrotjänster och komplexa system.
  • Du kan hämta data med ett enda API-anrop.
  • Det hjälper dig med frågebatchning och cachning.
  • Du stöter inte på problem med överhämtning och underhämtning.
  • Skräddarsy önskemål efter dina behov.
  • Det hjälper dig att upptäcka schemat i lämpligt format.
  • GraphQL håller automatiskt dokumentationen synkroniserad med API-ändringar.
  • API-utveckling är möjlig utan versionshantering.
  • GraphQL-fält används i flera frågor som kan delas till en högre komponentnivå för återanvändning.
  • Du kan välja vilka funktioner som ska exponeras och hur de fungerar.
  • Den kan användas för snabb applikationsprototypping.

Tillämpningar av GraphQL

Här är de viktiga tillämpningarna av GraphQL:

  • Det tillhandahåller Relay och andra klientramar
  • GraphQL hjälper dig att förbättra prestandan för mobilappen.
  • Det kan minska överhämtningsproblem för att sänka molntjänsten på serversidan och minska nätverksanvändningen på klientsidan.
  • Den kan användas när klientapplikationen ska ange vilka fält som behövs i långa frågeformat.
  • GraphQL kan utnyttjas fullt ut när du måste lägga till funktionalitet till ditt gamla eller befintliga API.
  • Det används när du ska förenkla komplexa API.
  • Blanda och mosa fasadmönster, som ofta används i objektorienterad programmering.
  • När du måste samla data från mer än en plats till ett bekvämt API.
  • Du kan använda GraphQL som en abstraction på ett befintligt API för att specificera svarsstruktur baserat på användarnas behov.

Dessa fördelar vilar alla på tre rörliga delar som arbetar tillsammans.

GraphQL nyckelkomponenter

Nu i denna GraphQL-handledning, låt oss lära oss nyckelkomponenterna i GraphQL:

GraphQL nyckelkomponenter
GraphQL nyckelkomponenter

Som visas i figuren ovan finns det tre nyckelkomponenter i GraphQL: 1) Fråga, 2) Resolver och 3) Schema.

Fråga

Frågan är en API-begäran som görs av klientdatorapplikationen. Den stöder förstärkningar och pekar på arrayer. Fråga används för att läsa eller hämta värden.

Delar av frågan:

Följande är de viktiga delarna av Query

  1. Fält:

Ett fält indikerar helt enkelt att vi ber servern om specifik information. Följande är ett GraphQL-exempel på ett fält i en GraphQL-fråga.

query {
    team {
        id
        name
    }
}

Servern svarar med ett JSON-dokument vars form speglar frågan:

{
    "data": {
        "team": [
            {
                "id": 1,
                "name": "Avengers"
            }
        ]
    }
}

I GraphQL-exemplet ovan frågar vi servern efter fältet som heter team och dess underfält som id och name. GraphQL-servern returnerar exakt den data vi begärde.

  1. Argument

In REST, kan vi bara skicka en enda uppsättning argument som URL segment och frågeparametrar. För att hämta en specifik profil ser ett typiskt REST-anrop ut så här:

GET /api/team?id=2
Content-Type: application/json

{
    "id": 2,
    "name": "Justice League"
}

lösa

Resolvers ger anvisningarna för att konvertera GraphQL-drift till data. De löser frågan till data genom att definiera resolverfunktioner.

Den visar servern processen samt platsen för att hämta data enligt ett specifikt fält. Resolvern separerar även databasschema och API-schema. Den separerade informationen hjälper till att modifiera innehållet som erhålls från databasen.

Schema

Ett GraphQL-schema är centrum för GraphQL-implementeringen. Den beskriver den funktionalitet som är tillgänglig för de klienter som ansluter till den.

Funktioner i GraphQL

Här är viktiga funktioner i GraphQL:

  • Det tillhandahåller deklarativt frågespråk, vilket inte är absolut nödvändigt.
  • Den är hierarkisk och produktcentrerad.
  • GraphQL är starkt skrivet. Det betyder att frågor exekveras inom ramen för ett visst system.
  • Frågor i GraphQL kodas i klienten, inte i servern.
  • Den har alla funktioner i applikationslagret i OSI-modellen.

GraphQL-klienter

GraphQL-klient är en kod som gör POST-förfrågningar till en relevant GraphQL-server. Du kan fråga ett GraphQL API direkt, men det goda tillvägagångssättet är att utnyttja ett dedikerat klientbibliotek med hjälp av Relay.

Detta JavaSkriptbiblioteket är utvecklat av Facebook för att göra React-applikationer med GraphQL. GraphQL-klienter kan vara ett CMS som Drupal, en ensidig applikation, en mobilapplikation, etc.

GraphQL-servrar

GraphQL-servrar är serversidesimplementeringar av GraphQLs specifikation. Den visar dina data som ett GraphQL API, som ditt klientprogram kan fråga efter. databas.

GraphQL Gateways

Gateway är ett mikrotjänstmönster där du kan bygga en separat tjänst för att hantera andra backend-tjänster. Det erbjuder fungerande dokumentation och ett bekvämt sätt att samla in data från mer än en källa med en enda förfrågan.

Vad är variabeln i GraphQL?

A Variabel i GraphQL används för att separera de dynamiska värdena från klientfrågan och skicka frågan som en unik ordbok. Variabel i GraphQL kan också användas för att återanvända frågan eller mutationer skrivna av klienten med individuella argument. I graphQL kan du inte skicka dynamiska argument direkt i frågesträngen. Anledningen är att kod på klientsidan behöver manipulera frågesträngen dynamiskt vid den tidpunkt då du kör programmet.

GraphQL har ett bra sätt att faktorisera de dynamiska värdena från frågan. Den skickar dem som en separat ordbok. Dessa värden kallas variabler. När vi arbetar med variabler behöver vi göra följande tre saker:

  1. Ersätt det statiska värdet i frågan med ett variabelnamn.
  2. Deklarera variabelnamnet som en av variablerna som accepteras av GraphQL-frågan.
  3. Skicka värdet i den transportspecifika ordboken över variabler.

Så här ser det ut totalt. Först frågan, som deklarerar variabeln:

query HeroNameAndFriends($episode: Episode) {
    hero(episode: $episode) {
        name
        friends {
            name
        }
    }
}

Sedan skickas den separata ordlistan med variabelvärden bredvid:

{
    "episode": "JEDI"
}

Och svaret som returnerades av servern:

{
    "data": {
        "hero": {
            "name": "R2-D2",
            "friends": [
                { "name": "Luke Skywalker" },
                { "name": "Han Solo" },
                { "name": "Leia Organa" }
            ]
        }
    }
}

Som du kan se i ovanstående GraphQL-exempel har vi helt enkelt skickat en annan variabel än att behöva konstruera en ny fråga.

Vad är mutation?

En mutation är ett sätt att ändra datasetet i GraphQL. Den modifierar data i datalagret och returnerar ett värde. Mutationer hjälper dig att infoga, uppdatera eller radera data. Generellt definieras mutationer som en schemadel.

Punkter att tänka på när du designar GraphQL-mutationer

Här är de viktiga punkterna när du designar GraphQL:

  • Namngivning: Först och främst måste du namnge ditt mutationsverb. Sedan substantivet, eller "objekt" om tillämpligt. Använd camelCase när du namnger mutationer.
  • Specificitet: Du måste göra mutationsspecifik så mycket som möjligt. Mutationer bör representera semantiska åtgärder som användaren har vidtagit.
  • Inmatningsobjekt: Använd en unik, nödvändig, indataobjekttyp som ett argument för att utföra mutation på klienten.
  • Unik nyttolasttyp: Du bör använda en unik nyttolasttyp för varje mutation. Du kan också lägga till mutationsutgången som ett fält till den specifika nyttolasttypen.
  • Häckande: Använd kapsling till din mutation varhelst det är vettigt. Det låter dig utnyttja GraphQL API fullt ut.

Frågor läses och mutationer skrivs. En tredje operationstyp täcker data som ändras medan klienten fortfarande är ansluten.

Vad är en prenumeration i GraphQL?

A prenumeration är den tredje operationstypen i GraphQL-specifikationen, vid sidan av fråga och mutation. En fråga och en mutation slutförs var och en i en begäran och svar. En prenumeration håller istället en långlivad anslutning öppen, vanligtvis via WebSockets, så att servern skickar ett nytt resultat till klienten varje gång en specifik händelse inträffar.

Syntaxen speglar en fråga, där nyckelordet prenumeration ersätter frågan:

subscription OnCommentAdded($postId: ID!) {
    commentAdded(postId: $postId) {
        id
        content
        author {
            name
        }
    }
}

Tre punkter skiljer prenumerationer åt i praktiken.

  • Händelsedriven, inte omröstad: Klienten registrerar intresse en gång. Inget mer skickas förrän servern publicerar en matchande händelse, vilket är mycket billigare än upprepad pollning.
  • Ett rotfält per prenumeration: Specifikationen tillåter endast ett enda toppnivåfält, till skillnad från en fråga som kan begära flera samtidigt.
  • Bäst att hålla i liten skala: Tryck bara på de fält som gränssnittet måste uppdatera. Livechatt, aviseringar och pristickers är de vanligaste användningsområdena.

Skillnaden mellan GraphQL och REST

Följande tabell visar viktig skillnad mellan GraphQL och REST.

GraphQL REST
Den följer klientdriven arkitektur. Den följer serverdriven arkitektur.
GraphQL kan organiseras i termer av ett schema. REST kan organiseras i termer av endpoints.
GraphQL är en växande community. REST är ett mycket stort samhälle.
Utvecklingshastigheten i GraphQL är snabb. Utvecklingshastigheten i REST är långsam.
Inlärningskurvan i GraphQL är brant. Inlärningskurvan i REST är måttlig.
Identiteten är skild från hur du hämtar den. Slutpunkten du anropar i REST är identiteten för ett visst objekt.
I GraphQL bestämmer klienten vilka fält den tar emot. Formen och storleken på resursen bestäms av servern i REST.
GraphQL ger hög konsistens över alla plattformar. Det är svårt att få konsekvens på alla plattformar.

Nackdelar med GraphQL

Här är GraphQL-nackdelarna:

  • Ungt ekosystem
  • Brist på resurser på backend-delen.
  • Saknar designmönster för en komplex app.
  • Prestandaproblem med komplexa frågor.
  • Overkill för små applikationer
  • GraphQL är inte beroende av HTTP-cachemetoderna som möjliggör lagring av begäraninnehåll.
  • GraphQL förstår inte filer. Därför ingår inte en filuppladdningsfunktion i den.
  • Med GraphQL, var beredd på att ha mycket utbildning före utveckling som att lära sig Schema Definition Language.

Appar och verktyg med öppen källkod som används av GraphQL

De viktiga appar och verktyg med öppen källkod som används av GraphQL är följande:

  • GatsbyGatsby är en applikation som drivs av GraphQL och kan använda data som härrör från mer än en GraphQL API-källa. Du kan använda den för att utveckla en statisk och klientbaserad React-applikation.
  • GraphiQL: Det är en IDE som integreras med webbläsaren och även interagerar med GraphQLs API. Några av funktionerna som GraphiQL inkluderar är mutationer, datafrågor och autokompletteringsfrågor.
  • GraphQL lekplats: Det är en kraftfull IDE som har en inbyggd editor för att hantera mutationer, validering, GraphQl-frågor, prenumerationer etc. Utvecklaren kan använda denna IDE för att visualisera schemats struktur. Projektet är nu pensionerat och dess funktioner har återinförts i GraphiQL.
  • prisma: Prisma är en databasabstraction-lagret, nu levererat som en typsäker ORM, som i stor utsträckning paras ihop med en GraphQL-server för att exponera CRUD-operationer (skapa, läsa, uppdatera och ta bort).
  • Bit: Det är ett verktyg och plattform med öppen källkod som konverterar återanvändbar kod till komponenter. Utvecklare kan använda dem för att dela och utveckla olika projekt.

Vanliga frågor

Nej. GraphQL är ett frågespråk för API:er, inte för databaser. Det placeras framför den lagring du redan använder, och resolvers översätter varje fält till SQL, ett REST-anrop eller någon annan källa.

De flesta förfrågningar returnerar HTTP 200 oavsett resultat. Fel visas i en felmatris på toppnivå bredvid datafältet, så klienter måste granska brödtexten snarare än att enbart förlita sig på statuskoden.

Ett kapslat fält kan utlösa ett databasanrop per överordnad post, så tio team orsakar elva frågor. Batchbibliotek som DataLoader grupperar dessa anrop i en enda begäran och tar bort flaskhalsen.

Ja. Ange tabelldefinitionerna eller exempel-JSON så utarbetar en AI-assistent typer, fält och relationer i Schema Definition Language. Revvisa nullbarhet och paginering innan den används i produktion.

Ja. Ge den slutpunkten och ett exempelsvar, så returnerar en AI-assistent motsvarande fråga plus en resolver-disposition. Jämför båda svaren fält för fält innan du ersätter REST-anropet.

Sammanfatta detta inlägg med: