GraphQL — co to jest i jak działa?

GraphQL to język zapytań do API który daje klientowi pełną kontrolę nad danymi. Poznaj Query, Mutation, Subscription, schema SDL i kiedy wybrać GraphQL zamiast REST.

Czym jest GraphQL?

GraphQL to język zapytań do API stworzony przez Facebook w 2012 roku, open-sourcowany w 2015. Zamiast wielu endpointów REST, GraphQL oferuje jeden endpoint i pozwala klientowi precyzyjnie zdefiniować jakich danych potrzebuje — nie więcej, nie mniej.

GraphQL jest używany przez Facebook, GitHub, Twitter, Shopify, Airbnb i tysiące innych firm. Szczególnie wartościowy w aplikacjach z złożonymi, powiązanymi danymi i wieloma typami klientów (web, mobile, TV) o różnych wymaganiach dotyczących danych.

Stworzony przez

Facebook (Meta)

2012 (internal), 2015 (open-source)

Jeden endpoint

POST /graphql

Wszystkie operacje przez jeden URL

Typowany

Schema SDL

Kontrakt klient-serwer z pełną introspection

3 operacje GraphQL

Query

Operacja odczytu danych — odpowiednik GET w REST. Queries mogą być wykonywane równolegle.

query GetUser($id: ID!) {
  user(id: $id) {
    id
    name
    email
    posts {
      title
      createdAt
    }
  }
}
Mutation

Operacja zapisu, aktualizacji lub usunięcia danych — odpowiednik POST/PUT/DELETE w REST. Mutacje wykonywane sekwencyjnie.

mutation CreatePost($input: CreatePostInput!) {
  createPost(input: $input) {
    id
    title
    author {
      name
    }
  }
}
Subscription

Operacja real-time — klient subskrybuje zdarzenia. Serwer wysyła dane gdy zdarzenie nastąpi (WebSocket).

subscription OnNewMessage($channelId: ID!) {
  messageAdded(channelId: $channelId) {
    id
    text
    sender { name }
    createdAt
  }
}

GraphQL Schema (SDL)

Schema Definition Language (SDL) to język definiowania typów i operacji GraphQL. Schema jest kontraktem między klientem a serwerem — wszystko co nie jest w schema, nie istnieje.

type Query {
  user(id: ID!): User
  users(limit: Int, offset: Int): [User!]!
  post(slug: String!): Post
}

type Mutation {
  createUser(input: CreateUserInput!): User!
  updatePost(id: ID!, input: UpdatePostInput!): Post!
  deletePost(id: ID!): Boolean!
}

type User {
  id: ID!
  name: String!
  email: String!
  role: UserRole!
  posts: [Post!]!
  createdAt: DateTime!
}

type Post {
  id: ID!
  title: String!
  content: String!
  author: User!
  tags: [String!]!
  publishedAt: DateTime
}

enum UserRole {
  ADMIN
  EDITOR
  VIEWER
}

input CreateUserInput {
  name: String!
  email: String!
  role: UserRole = VIEWER
}

GraphQL vs REST — porównanie

AspektGraphQLREST API
EndpointyJeden endpoint: POST /graphqlWiele endpointów: /users, /posts, /comments
Struktura danychKlient definiuje dokładną strukturę w zapytaniuSerwer definiuje stałą strukturę odpowiedzi
Over-fetchingBrak — pobierasz tylko potrzebne polaCzęsty — endpoint zwraca wszystkie pola zasobu
Under-fetchingBrak — jeden request pobiera wszystkie powiązane daneCzęsty — N+1 zapytań dla powiązanych zasobów
TypowanieStrongly typed schema (SDL) — kontrakt klient-serwerOpcjonalne (OpenAPI/Swagger) — często brak
WersjonowanieBrak tradycyjnego wersjonowania — schema evolutionURL versioning: /api/v1/, /api/v2/
CachingTrudniejsze — POST, persisted queries, Apollo CacheŁatwe — HTTP caching, CDN, ETag
NarzędziaGraphiQL, Apollo Studio, GraphQL PlaygroundSwagger UI, Postman, curl

Ekosystem GraphQL

Apollo Client

Client-side

Najpopularniejsza biblioteka GraphQL dla React/JS. Zarządza state, caching, optymistic updates.

apollographql.com

Apollo Server

Server-side

Node.js GraphQL server. Obsługuje schema, resolvers, datasources, subscriptions.

apollographql.com

Relay

Client-side

Biblioteka React od Meta. Zaawansowany caching, pagination (Connections spec), compiler.

relay.dev

Hasura

Backend-as-a-Service

Automatycznie generuje GraphQL API z bazy danych PostgreSQL. Zero-code backend.

hasura.io

GraphQL Yoga

Server-side

Lekki, szybki GraphQL server od The Guild. Wsparcie dla subscriptions, file uploads.

the-guild.dev/graphql/yoga-server

URQL

Client-side

Lekka alternatywa dla Apollo Client. Modularny, mały bundle, łatwy w konfiguracji.

formidable.com/open-source/urql

FAQ — GraphQL

Co to jest GraphQL?

GraphQL to język zapytań do API oraz runtime do ich wykonywania, stworzony przez Facebook w 2012 roku i open-sourcowany w 2015. W przeciwieństwie do REST, GraphQL pozwala klientowi precyzyjnie określić jakich danych potrzebuje — nie więcej, nie mniej. Jeden endpoint (/graphql) obsługuje wszystkie operacje: Query (odczyt), Mutation (zapis) i Subscription (real-time). GraphQL jest typowany — schema definiuje dostępne typy i operacje.

Czym różni się GraphQL od REST API?

REST API: wiele endpointów (/users, /posts, /comments), fixed response structure, over-fetching (za dużo danych) lub under-fetching (za mało — N+1 problem), wersjonowanie przez URL (/v1/, /v2/). GraphQL: jeden endpoint (/graphql), klient definiuje strukturę danych, brak over/under-fetchingu, brak tradycyjnego wersjonowania (schema evolution przez deprecated fields). GraphQL lepszy dla złożonych, powiązanych danych; REST prostszy dla prostych CRUD API.

Co to jest GraphQL Schema?

GraphQL Schema (SDL — Schema Definition Language) to kontrakt między klientem a serwerem — definicja wszystkich dostępnych typów, pól, zapytań i mutacji. Schema jest typowana i samodokumentująca. Przykład: 'type User { id: ID!, name: String!, email: String!, posts: [Post!]! }'. Schema First Development: najpierw definiujesz schema, potem implementujesz resolvers. Introspection pozwala narzędziom (GraphiQL) na automatyczne generowanie dokumentacji.

Co to są resolvers w GraphQL?

Resolvers to funkcje po stronie serwera GraphQL, które faktycznie pobierają dane dla każdego pola w schema. Dla każdego pola można zdefiniować resolver — funkcję (parent, args, context, info) => data. Jeśli resolver nie jest zdefiniowany, GraphQL użyje domyślnego (zwraca pole z parent object). N+1 problem w resolverach rozwiązuje się przez DataLoader (batching i caching żądań do bazy danych).

Kiedy używać GraphQL zamiast REST?

GraphQL jest lepszy gdy: aplikacja ma złożone, powiązane dane (social network, e-commerce z wariantami), wiele różnych klientów (mobile, web, TV) o różnych potrzebach danych, chcesz uniknąć over-fetchingu, budujesz BFF (Backend for Frontend). REST jest lepszy gdy: proste CRUD API, publiczne API dla zewnętrznych developerów (REST bardziej znajomy), potrzebujesz prostego cachowania HTTP, masz ograniczony czas — REST szybszy w implementacji.

Kontakt

Skontaktuj się z nami

Porozmawiajmy o Twoim projekcie. Bezpłatna wycena w ciągu 24 godzin.

Wyślij zapytanie

Bezpłatna wycena w 24h
Bez zobowiązań
Indywidualne podejście
Ekspresowa realizacja

Telefon

+48 790 814 814

Pon-Pt: 9:00 - 18:00

Email

adam@fotz.pl

Odpowiadamy w ciągu 24h

Adres rejestrowy

Poznańska 117/11

62-023 Kamionki · obsługa zdalna

Godziny pracy

Pon - Pt9:00 - 18:00
Sob - NdzZamknięte

Wolisz porozmawiać?

Zadzwoń teraz i porozmawiaj z naszym specjalistą o Twoim projekcie.

Zadzwoń teraz