Creat inițial de inginerii Facebook în 2012 și lansat ca standard deschis, GraphQL este un limbaj declarativ de interogare a datelor și un mediu de execuție pe server pentru API-uri. În contrast cu arhitectura REST tradițională (unde serverul impune endpoint-uri fixe care returnează adesea fie prea multe date – over-fetching, fie prea puține – under-fetching), GraphQL îi oferă clientului puterea deplină de a solicita exact câmpurile necesare și nimic mai mult, printr-un singur apel HTTP POST.
GraphQL este strict tipizat: întregul sistem este ghidat de o schemă centrală scrisă în Schema Definition Language (SDL), permițând generarea automată de cod TypeScript, validare la compilare și unelte avansate de explorare precum Apollo Studio sau GraphiQL.
# Abordarea REST Tradițională (Multiple apeluri de rețea, date redundante):
# GET /api/v1/users/12 ──► Returnează 40 de câmpuri (inclusiv adrese, istoric etc.)
# GET /api/v1/users/12/orders ──► Al doilea apel pentru a prelua comenzile
# GET /api/v1/products/55 ──► Al treilea apel pentru detaliile fiecărui produs
# Abordarea GraphQL (O singură interogare declarativă pe un singur endpoint /graphql):
query GetUserProfile {
user(id: "12") {
name
email
orders(limit: 3) {
id
totalAmount
items { title }
}
}
}
# Clientul primește exact această structură JSON înapoi, fără un singur octet irosit!
Pilonii Tehnologici ai GraphQL
| Operațiune / Concept | Cuvânt Cheie SDL | Rol în Arhitectura API |
|---|---|---|
| Interogare (Query) | type Query { ... } |
Operațiuni read-only de preluare de date (echivalentul HTTP GET). |
| Mutație (Mutation) | type Mutation { ... } |
Operațiuni care modifică starea pe server (echivalentul HTTP POST/PUT/DELETE). |
| Abonament (Subscription) | type Subscription { ... } |
Fluxuri de date asincrone în timp real trimise prin conexiuni WebSockets. |
| Pattern-ul DataLoader | Batching & Caching | Elimină problema N+1 interogări SQL la rezolvarea relațiilor imbricate. |
# schema.graphql
enum OrderStatus {
PENDING
PAID
CANCELLED
}
type User {
id: ID!
name: String!
email: String!
orders: [Order!]!
}
type Order {
id: ID!
amount: Float!
status: OrderStatus!
}
type Query {
me: User
order(id: ID!): Order
}
type Mutation {
createOrder(amount: Float!): Order!
}