7.2 HTTP és REST API alapok fejlesztő szemmel
Áttekintő
Fejlesztőként szinte minden nap találkozol HTTP kérésekkel és REST API-kkal – akár a frontend küldi őket, akár a backend fogadja, akár egy külső szolgáltatást hívsz meg. Mégis sokan nem értik pontosan, mi történik a motorháztető alatt.
Ez az alfejezet nem hálózati protokollok mélyreható tárgyalása. A cél az, hogy ne legyen fekete doboz számodra az API-kommunikáció: tudd, melyik HTTP metódust mikor kell használni, hogyan épül fel egy kérés és válasz, és mit jelent az, hogy egy API "RESTful". Ez a tudás napi szinten használható – interjúkon, code review-kon és hibakeresésnél egyaránt.
Miért számít ez az állásinterjún? Szinte minden junior interjún felmerül valamilyen formában a HTTP / REST kérdés. "Mi a különbség a GET és POST között?" vagy "Milyen státuszkódot ad vissza egy sikeres létrehozás?" – ezeket elvárják.
Miért számít production környezetben? Ha rossz HTTP metódust használsz, caching-problémákba, security-résekbe vagy meglepő viselkedésbe futsz. Ha nem érted a státuszkódokat, nem tudsz jó hibakezelést írni.
Részletes leírás
Mi az a HTTP?
A HTTP (HyperText Transfer Protocol) az internetes kommunikáció alapja. Minden alkalommal, amikor a böngésző megnyit egy oldalt, vagy az alkalmazásod adatot küld egy szerverre, HTTP-n keresztül zajlik a kommunikáció.
A HTTP kérés-válasz modellen alapszik:
- A kliens (böngésző, mobilapp, backend service) küld egy kérést (request)
- A szerver visszaküld egy választ (response)
Ez az egész – semmi mágikus.
HTTP metódusok – melyik mire való?
A HTTP metódus (más néven "ige") megmondja a szervernek, mit szeretnél csinálni. Öt metódust kell biztosan ismerned:
| Metódus | Mire való? | Példa |
|---|---|---|
| GET | Adatok lekérése | Felhasználók listája |
| POST | Új erőforrás létrehozása | Új felhasználó regisztrálása |
| PUT | Erőforrás teljes felülírása | Felhasználó összes adatának frissítése |
| PATCH | Erőforrás részleges módosítása | Csak az email cím megváltoztatása |
| DELETE | Erőforrás törlése | Felhasználó törlése |
Fontos különbség – PUT vs. PATCH:
PUT esetén az egész erőforrást elküldöd. Ha valamit nem adsz meg, felülírja (vagy törli) azt a mezőt.
PATCH esetén csak a változtatni kívánt mezőket küldöd.
// PUT – felülírja az egész objektumot
PUT /users/42
{ "name": "Kovács Péter", "email": "peter@example.com", "role": "admin" }
// PATCH – csak az emailt változtatja
PATCH /users/42
{ "email": "peter.kovacs@example.com" }
GET nem módosít adatot. Ez nem csak konvenció – ha valaki cache-eli a GET kéréseket (és ezt sokan teszik), akkor a módosítás nem fog lefutni, vagy épp kétszer fut le. A GET idempotens és biztonságos legyen: futtathatod akárhányszor, nem változtat semmit.
URL struktúra – hogyan épül fel egy API végpont?
https://api.example.com/v1/users/42/posts?status=published&limit=10
| Rész | Érték | Mire való? |
|---|---|---|
| Protokoll | https | Titkosított kommunikáció |
| Domain | api.example.com | Melyik szerverre mész |
| API verzió | /v1 | Visszafelé-kompatibilitás |
| Erőforrás | /users/42/posts | Melyik erőforrást éred el |
| Query paraméterek | ?status=published&limit=10 | Szűrés, lapozás, rendezés |
RESTful URL-ek szabályai:
- Erőforrás neveket főnévként írd, nem igékkel:
/usersnem/getUsers - Az ID az URL-ben legyen:
/users/42nem?id=42 - Hierarchia jelzi a kapcsolatot:
/users/42/posts= 42-es felhasználó posztjai
Request felépítése
Egy HTTP kérés három részből áll:
1. Sor (Request line):
GET /users/42 HTTP/1.1
2. Fejlécek (Headers):
Host: api.example.com
Authorization: Bearer eyJhbGci...
Content-Type: application/json
Accept: application/json
A legfontosabb headerek:
Content-Type: milyen formátumban küldöd a body-tAuthorization: hogyan azonosítod magadAccept: milyen formátumú választ vársz
3. Törzs (Body): Csak POST, PUT, PATCH kéréseknél van. GET-nél nincs body.
{
"name": "Kovács Péter",
"email": "peter@example.com"
}
Response felépítése
A szerver válasza szintén headerekből és body-ból áll, plusz van egy státuszkód:
HTTP/1.1 201 Created
Content-Type: application/json
{
"id": 42,
"name": "Kovács Péter",
"email": "peter@example.com",
"created_at": "2026-04-30T10:00:00Z"
}
Státuszkódok – a legfontosabbak
A státuszkód megmondja, mi történt a kéréseddel. Három számjegyű szám, az első jelzi a kategóriát:
2xx – Siker
| Kód | Neve | Mikor? |
|---|---|---|
| 200 | OK | GET, PUT, PATCH sikeres volt |
| 201 | Created | POST után, új erőforrás létrejött |
| 204 | No Content | DELETE sikeres, nincs visszaküldendő adat |
3xx – Átirányítás
| Kód | Neve | Mikor? |
|---|---|---|
| 301 | Moved Permanently | Az URL végleg megváltozott |
| 304 | Not Modified | Cache érvényes, nem kell újra tölteni |
4xx – Klienshiba (te rontottad el)
| Kód | Neve | Mikor? |
|---|---|---|
| 400 | Bad Request | Hibás kérés (pl. hiányzó mező) |
| 401 | Unauthorized | Nem vagy bejelentkezve |
| 403 | Forbidden | Be vagy lépve, de nincs jogod |
| 404 | Not Found | Az erőforrás nem létezik |
| 422 | Unprocessable Entity | Validációs hiba |
| 429 | Too Many Requests | Rate limit elérve |
5xx – Szerverhiba (a szerver rontotta el)
| Kód | Neve | Mikor? |
|---|---|---|
| 500 | Internal Server Error | Általános szerverhiba |
| 502 | Bad Gateway | Upstream szerver nem válaszol |
| 503 | Service Unavailable | Szerver le van állítva/túlterhelt |
401 vs. 403 – ez előkerül interjúkon:
- 401: "Nem tudom, ki vagy" – nincs autentikáció
- 403: "Tudom, ki vagy, de nem engedem" – nincs jogosultság
JSON mint adatcsere formátum
A REST API-k többsége JSON-t (JavaScript Object Notation) használ az adatcserére. Szinte minden modern programozási nyelvből egyszerűen olvasható és írható.
{
"id": 42,
"name": "Kovács Péter",
"email": "peter@example.com",
"is_active": true,
"score": 9.5,
"tags": ["backend", "python"],
"address": null
}
JSON alapszabályok:
- Kulcsok mindig idézőjelben:
"name"nemname - Értékek típusai: string, number, boolean (
true/false), array, object, null - Utolsó elem után nincs vessző (trailing comma hibát okoz)
RESTful elvek alapszinten
A REST (Representational State Transfer) nem egy protokoll, hanem egy tervezési elvrendszer. Nem kell minden elvét fejből tudni, de a lényeget érdemes érteni:
1. Erőforrás-orientált Az URL erőforrást jelöl, nem műveletet. /users erőforrás, GET /users a lekérés művelete.
2. Állapotmentes (stateless) Minden kérés önálló – a szerver nem emlékezik az előző kérésedre. Az azonosításhoz szükséges adatot (pl. token) te küldöd minden kérésben.
3. Egységes interfész Mindenki ugyanolyan módon kommunikál az API-val – nincs "speciális" endpoint csak neked.
Gyakorlatban: Egy "elég RESTful" API:
- Megfelelő HTTP metódusokat használ
- Értelmesen adja vissza a státuszkódokat
- JSON-t küld és fogad
- Az URL erőforrást jelöl, nem műveletet
Életszerű példák
Példa 1: CRUD API tervezése blogposztokhoz
GET /posts → Összes poszt listája
GET /posts/15 → 15-ös poszt részletei
POST /posts → Új poszt létrehozása
PUT /posts/15 → 15-ös poszt teljes felülírása
PATCH /posts/15 → 15-ös poszt részleges módosítása
DELETE /posts/15 → 15-ös poszt törlése
Mi jön vissza?
POST /posts → 201 Created + az új poszt adatai (id-val együtt)
GET /posts/999 → 404 Not Found (ha nem létezik)
DELETE /posts/15 → 204 No Content (ha sikerült)
Példa 2: Frontend-backend kommunikáció valóságban
Egy React frontend feltölti a felhasználó profilképét:
POST /users/42/avatar
Content-Type: multipart/form-data
Authorization: Bearer eyJhbGci...
[binary file data]
A szerver visszaküldi:
HTTP/1.1 200 OK
Content-Type: application/json
{
"avatar_url": "https://cdn.example.com/avatars/42.jpg",
"updated_at": "2026-04-30T10:15:00Z"
}
Ha a user nem be van lépve:
HTTP/1.1 401 Unauthorized
{ "error": "Authentication required" }
Ha be van lépve, de nincs joga módosítani más profilját:
HTTP/1.1 403 Forbidden
{ "error": "You can only update your own profile" }
Példa 3: Hibás API tervezés – amit kerülj el
// ROSSZ – ige az URL-ben, nem erőforrás
POST /createUser
GET /getUserById?id=42
GET /deletePost?id=15 // GET ne töröljön!
// JÓ – erőforrás-orientált
POST /users
GET /users/42
DELETE /posts/15
// ROSSZ – minden 200-at ad vissza, hibás esetben is
HTTP/1.1 200 OK
{ "success": false, "error": "User not found" }
// JÓ – a státuszkód tükrözi a valóságot
HTTP/1.1 404 Not Found
{ "error": "User not found" }
Ez az utóbbi hiba különösen csúnya, mert a frontend nem tudja, hogy 200 OK esetén is lehet hiba – le kell ellenőriznie a body-t is. A fejlesztők utálják.
Példa 4: API hívás különböző nyelveken
Python (requests):
import requests
response = requests.get(
"https://api.example.com/users/42",
headers={"Authorization": "Bearer my-token"}
)
if response.status_code == 200:
user = response.json()
print(user["name"])
elif response.status_code == 404:
print("Felhasználó nem található")
JavaScript (fetch):
const response = await fetch("https://api.example.com/users/42", {
headers: { "Authorization": "Bearer my-token" }
});
if (response.ok) {
const user = await response.json();
console.log(user.name);
} else if (response.status === 404) {
console.log("Felhasználó nem található");
}
PHP (Laravel HTTP Client):
$response = Http::withToken('my-token')
->get('https://api.example.com/users/42');
if ($response->successful()) {
$user = $response->json();
echo $user['name'];
} elseif ($response->status() === 404) {
echo 'Felhasználó nem található';
}
Tesztfeladatok
1. feladat – HTTP metódus választás
Melyik HTTP metódust használnád az alábbi műveletekhez? Indokold meg a döntésedet.
a) Egy cikk elolvasása (lekérése) az ID alapján
b) Új komment hozzáadása egy cikkhez
c) Saját felhasználóneved megváltoztatása (csak azt a mezőt)
d) Egy régi bejegyzés teljes tartalmának és metaadatainak felülírása
e) Egy értesítés törlése
2. feladat – Státuszkód párosítás
Kösd össze a szituációt a megfelelő HTTP státuszkóddal!
| Szituáció | Státuszkód |
|---|---|
| A) Sikeres adatlekérés | 1. 201 |
| B) Új erőforrás sikeresen létrehozva | 2. 400 |
| C) A kért felhasználó nem létezik | 3. 401 |
| D) A kérésből hiányzik a kötelező "email" mező | 4. 403 |
| E) Nincs bejelentkezve, de védett végpontot hív | 5. 200 |
| F) Be van lépve, de csak admin törölhet | 6. 204 |
| G) Törlés sikerült, nincs visszaküldendő adat | 7. 404 |
3. feladat – URL tervezés
Tervezd meg egy könyvtári API URL struktúráját az alábbi műveletekhez. Feltétel: RESTful elvek szerint, nem tartalmazhat igéket az URL-ben.
Műveletek:
- Összes könyv listázása
- Egy konkrét könyv részletei (ID alapján)
- Új könyv hozzáadása
- Könyv adatainak módosítása (részleges)
- Könyv törlése
- Egy adott könyv összes kölcsönzési rekordjának listázása
4. feladat – Kérés értelmezése
Olvasd el az alábbi HTTP kérést, és válaszolj a kérdésekre!
PATCH /api/v2/products/88/price HTTP/1.1
Host: shop.example.com
Authorization: Bearer eyJhbGci...abc
Content-Type: application/json
Accept: application/json
{
"price": 4990,
"currency": "HUF"
}
Kérdések:
- a) Mit csinál ez a kérés?
- b) Miért PATCH és nem PUT?
- c) Mi a szerepe az Authorization headernek?
- d) Mit vársz visszakapni, ha sikeres volt? (státuszkód + body felépítése)
- e) Mit vársz vissza, ha a 88-as termék nem létezik?
5. feladat – Hibás API tervezés azonosítása
Az alábbi API tervből azonosítsd a hibákat és indokold, mi a helyes megoldás!
GET /getAllUsers
GET /getUserDetails?id=5
POST /createNewProduct
GET /deleteOrder?orderId=12
PUT /updateUserEmail?userId=3&newEmail=test@example.com
6. feladat – Státuszkód kategóriák
Sorold be az alábbi státuszkódokat a megfelelő kategóriába (siker / klienshiba / szerverhiba / átirányítás), és egy mondatban írd le, mit jelent!
200, 201, 204, 301, 400, 401, 403, 404, 422, 429, 500, 503
7. feladat – JSON validáció
Az alábbi JSON-okban van hiba. Találd meg és javítsd ki!
a)
{
name: "Kovács Péter",
"email": "peter@example.com"
}
b)
{
"id": 1,
"active": True,
"score": 8.5,
}
c)
{
"tags": ["python", "backend",],
"level": null
}
8. feladat – 401 vs 403
Magyarázd el saját szavaiddal a különbséget a 401 és 403 státuszkód között! Adj egy-egy valós példát, mikor melyiket adja vissza egy szerver.
9. feladat – GET kérés mellékhatása
Egy fejlesztő az alábbi URL-t tervezi:
GET /orders/55/confirm
Szándéka: az URL meghívásával a 55-ös rendelés megerősítéssel jár (státusza "confirmed"-re változik).
Mi a probléma ezzel a tervvel? Mi lenne a helyes megoldás és miért?
10. feladat – API hibakezelés értékelése
Kaptál egy API-t, amely az összes kérésre 200-at ad vissza, de a body-ban jelzi, hogy hiba volt:
{
"success": false,
"error_code": "NOT_FOUND",
"message": "The requested resource does not exist."
}
- a) Mi a probléma ezzel a megközelítéssel?
- b) Hogyan érintené ez a frontend fejlesztők munkáját?
- c) Mi a helyes REST konvenciók szerinti megoldás?