==== GraphQL integráció ====
A GraphQL egy modern API-lekérdezési nyelv és futtatókörnyezet, amelyet a Facebook fejlesztett ki 2012-ben, majd 2015-ben nyílt forráskódúvá tett. A GraphQL célja, hogy rugalmasabb és hatékonyabb adatlekérdezési lehetőséget biztosítson a kliensalkalmazások számára.
A hagyományos REST API-k esetén a kliens különböző endpointokon keresztül kér le adatokat, és gyakran előfordul, hogy több HTTP-kérésre van szükség az összes szükséges információ megszerzéséhez. Emellett a szerver által visszaadott adatszerkezet fix, így a kliens sokszor több adatot kap, mint amire valójában szüksége van.
A GraphQL ezt a problémát úgy oldja meg, hogy a kliens pontosan megadhatja, milyen adatmezőket szeretne lekérdezni. A szerver ennek megfelelően csak a kért adatokat küldi vissza. Ez csökkenti a hálózati forgalmat és egyszerűbbé teszi az összetett adatszerkezetek lekérdezését.
A GraphQL működésének három alapvető eleme van:
* **Schema** – a rendszer adatmodelljének és lekérdezési lehetőségeinek leírása. A schema határozza meg, milyen típusok, mezők és műveletek érhetők el az API-ban.
* **Query** – adatlekérdezésre szolgál. A kliens meghatározza, hogy milyen mezőket szeretne visszakapni.
* **Mutation** – adatmódosító műveletek (például létrehozás, módosítás vagy törlés).
A GraphQL egyik fontos jellemzője, hogy általában **egyetlen endpointot** használ (például `/graphql`). A különböző műveleteket nem az URL-ek, hanem a lekérdezések szerkezete határozza meg.
A GraphQL különösen előnyös olyan rendszerekben, ahol:
* a kliensalkalmazások különböző adatszerkezeteket igényelnek,
* összetett, egymáshoz kapcsolódó adatok lekérdezése szükséges,
* fontos a hálózati forgalom minimalizálása.
Ugyanakkor a GraphQL implementációja általában összetettebb, mint egy hagyományos REST API, és a gyorsítótárazás vagy a jogosultságkezelés megvalósítása is több tervezést igényel.
Az alábbi részben bemutatjuk a GraphQL alapvető jellemzőit, valamint egy egyszerű Python alapú GraphQL API implementációját FastAPI és Strawberry könyvtárak segítségével.
Főbb tulajdonságok összehasonlítása a RESTAPI-val.
Hivatalos dokumentáció:
https://graphql.org/learn/
| | **REST API** | **GraphQL** |
| **Adatlekérdezés rugalmassága** | Fix végpontok és válaszok | Rugalmas lekérdezések, csak a szükséges adatokat kapod meg |
| **Kliens teljesítmény** | Többszöri kérések szükségesek különböző erőforrásokhoz | Egyetlen kérésben több adatforrásból is lekérhetők az adatok |
| **Adatok** | Több lekérdezésre lehet szükség összetett adatokhoz | Egyetlen kérésben lekérdezhető minden szükséges adat |
| **Hálózati hatékonyság** | Többszöri kérés esetén megnő a hálózati forgalom | Csökkenti a felesleges adatátvitelt és lekérdezések számát |
| **Használhatóság** | Egyszerű, széles körben ismert | Nehezebben elsajátítható, de hatékonyabb |
| **Gyorsítótárazás (Caching)** | HTTP cache és CDN támogatott | Nehezebb megvalósítani, egyedi cache stratégia szükséges |
| **Verziókezelés** | API verziózás szükséges (pl. `/v1/users`) | Nincs szükség verziókezelésre, mert a kliens választja ki a szükséges mezőket |
| **Adatstruktúra változás kezelése** | Módosítások új végpontok létrehozását igényelhetik | Az új mezők bevezethetők a régiek megtartásával |
| **Biztonság és hozzáférés-kezelés** | Beépített HTTP biztonság, szerepkörök | Finomhangolt hozzáférési szabályok szükségesek (pl. mezőszintű jogosultságok) |
| **Támogatott formátumok** | Általában JSON (de támogat másokat is) | JSON alapú (szigorúan GraphQL schema szerint) |
| **Alkalmazási körök** | Egyszerű CRUD API-khoz ideális | Összetett, dinamikus kliensigényekhez jobb választás |
Python virtuális környezet kialakítás után az alábbi sorral telepíthetjük a függőségeket:
pip install fastapi strawberry-graphql uvicorn
Mintapélda az első használathoz:
import strawberry
from fastapi import FastAPI
from strawberry.fastapi import GraphQLRouter
# User adatmodell
@strawberry.type
class User:
id: int
name: str
age: int
# Példa adatbázis
users = [
User(id=1, name="Noa", age=30),
User(id=2, name="Anna", age=25),
]
# GraphQL Query osztály
@strawberry.type
class Query:
@strawberry.field
def get_users(self) -> list[User]:
return users
# GraphQL Mutáció osztály (új felhasználó hozzáadása)
@strawberry.type
class Mutation:
@strawberry.mutation
def create_user(self, name: str, age: int) -> User:
new_user = User(id=len(users) + 1, name=name, age=age)
users.append(new_user)
return new_user
# GraphQL séma létrehozása
schema = strawberry.Schema(query=Query, mutation=Mutation)
# FastAPI alkalmazás létrehozása
app = FastAPI()
# GraphQL endpoint regisztrálása
graphql_app = GraphQLRouter(schema)
app.include_router(graphql_app, prefix="/graphql")
uvicorn.exe main:app --reload
A GraphQL Playground a következő URL-en elérhető lesz:
👉 http://127.0.0.1:8000/graphql
----
===== Mintafeladat: Könyvtári rendszer GraphQL-lel =====
==== Feladat leírása ====
Készítsünk egy egyszerű GraphQL API-t, amely egy könyvtár adatait kezeli. A rendszer tárolja a könyveket és a szerzőket, valamint lehetőséget ad új könyv felvitelére.
==== Követelmények ====
A GraphQL séma tartalmazza az alábbi típusokat:
* **Author**:
* `id` (Int)
* `name` (String)
* **Book**:
* `id` (Int)
* `title` (String)
* `author` (Author)
* `year` (Int)
==== Implementálandó funkciók ====
* **Lekérdezés:**
* Az összes könyv lekérdezése (cím, szerző neve, év)
* Egy szerző könyveinek lekérdezése név alapján
* **Mutáció:**
* Új könyv hozzáadása a következő adatokkal: cím, szerző ID, év
==== Példa lekérdezés ====
query {
books {
title
author {
name
}
year
}
}
==== Példa mutáció ====
mutation {
addBook(title: "1984", authorId: 1, year: 1949) {
id
title
author {
name
}
}
}
==== Technikai követelmények ====
* Használj **FastAPI** + **Strawberry GraphQL** könyvtárakat
* Tárolásra használj beépített listákat (pl. `authors`, `books`)
* A GraphQL endpoint legyen elérhető a `http://127.0.0.1:8000/graphql` címen
==== Bónusz feladat ====
* Valósíts meg egy új mutációt: egy szerző hozzáadása név alapján
* Lekérdezés, amely egy évszám alapján listázza a megjelent könyveket