===== REST API ===== A REST (Representational State Transfer) egy architekturális stílus hálózati alkalmazások tervezésére. A REST API olyan alkalmazásprogramozási interfész (API), amely a REST elveit követi, és a kommunikációhoz általában a HTTP protokollt használja. A REST koncepcióját Roy Fielding vezette be 2000-ben doktori disszertációjában. Fontos különbség a JSON-RPC-hez képest, hogy a REST nem egy szigorúan definiált protokoll, hanem egy architekturális irányelvrendszer. A REST erőforrás-orientált szemléletet használ. Ez azt jelenti, hogy a rendszer nem műveletek vagy függvényhívások köré szerveződik, hanem **erőforrások** köré. Egy erőforrás bármilyen entitást reprezentálhat, például egy felhasználót, terméket, rendelést vagy dokumentumot. Minden erőforrás egy egyedi URL segítségével azonosítható. Például: GET /users/15 GET /products/42 REST esetén a kliens nem közvetlenül függvényeket hív meg. Ehelyett a kliens erőforrásokon hajt végre műveleteket a szabványos HTTP metódusok segítségével. ==== A REST alapelvei ==== === Erőforrások azonosítása === Minden erőforrásnak egyedi azonosítóval kell rendelkeznie, amely általában egy URL. Az URL az erőforrást jelöli, nem a végrehajtandó műveletet. Helytelen (RPC-szerű) megközelítés: GET /getUserById?id=10 REST szemléletben inkább az erőforrást azonosítjuk: GET /users/10 === HTTP metódusok (igék) === A REST a szabványos HTTP metódusokra épül a műveletek meghatározásához. ^ Method ^ Jelentés ^ Példa ^ | GET | Erőforrás lekérdezése | GET /users/1 | | POST | Új erőforrás létrehozása | POST /users | | PUT | Erőforrás teljes cseréje | PUT /users/1 | | PATCH | Részleges módosítás | PATCH /users/1 | | DELETE | Erőforrás törlése | DELETE /users/1 | Fontos, hogy a műveletet a **HTTP metódus** határozza meg, nem az URL. === Állapotmentesség (Statelessness) === A JSON-RPC-hez hasonlóan a REST is állapotmentes. Minden kérésnek tartalmaznia kell minden szükséges információt a feldolgozáshoz. A szerver alapértelmezés szerint nem tárol kliens oldali munkamenet állapotot a kérések között (kivéve ha ezt például tokenek vagy cookie-k segítségével külön megvalósítják). Az állapotmentesség előnye, hogy javítja a rendszer skálázhatóságát és egyszerűbbé teszi az elosztott rendszerek működését. === Reprezentáció === Az erőforrások az úgynevezett **reprezentációk** formájában kerülnek átvitelre a kliens és a szerver között. A leggyakoribb formátumok: * JSON * XML * HTML * Plain text A modern REST API-k többsége **JSON formátumot** használ. Példa válasz: { "id": 1, "name": "Alice", "email": "alice@example.com" } ===== REST API szerver (Python + Flask) ===== Ebben a részben egy egyszerű REST API-t valósítunk meg Flask segítségével. Függőség telepítése: pip install flask Hozzunk létre egy //server.py// fájlt. from flask import Flask, jsonify, request app = Flask(__name__) users = [ {"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}, ] @app.route("/users", methods=["GET"]) def get_users(): return jsonify(users) @app.route("/users/", methods=["GET"]) def get_user(user_id): for user in users: if user["id"] == user_id: return jsonify(user) return jsonify({"error": "User not found"}), 404 @app.route("/users", methods=["POST"]) def create_user(): new_user = request.get_json() new_user["id"] = len(users) + 1 users.append(new_user) return jsonify(new_user), 201 @app.route("/users/", methods=["DELETE"]) def delete_user(user_id): global users users = [u for u in users if u["id"] != user_id] return jsonify({"message": "User deleted"}) if __name__ == "__main__": app.run(port=5000) A szerver indítása: python server.py ===== Tesztelés curl segítségével ===== Összes felhasználó lekérdezése: curl http://localhost:5000/users Új felhasználó létrehozása: curl -X POST http://localhost:5000/users \ -H "Content-Type: application/json" \ -d '{"name":"Charlie"}' Felhasználó törlése: curl -X DELETE http://localhost:5000/users/1 ==== HTTP státuszkódok ==== A REST API-k kommunikációjában fontos szerepet játszanak a HTTP-státuszkódok. ^ Code ^ Jelentés ^ | 200 | OK | | 201 | Created | | 400 | Bad request | | 401 | Unauthorized | | 404 | Not found | | 500 | Server error | A státuszkódok a válasz fontos részét képezik és jelzik a kliens számára, hogy a kérés sikeres volt-e. ==== Előnyök és korlátok ==== A REST széles körben elterjedt, könnyen érthető és természetesen illeszkedik a HTTP-infrastruktúrához. Támogatja a gyorsítótárazást (caching), a hitelesítési mechanizmusokat, valamint a különböző szabványos eszközöket és könyvtárakat. Ugyanakkor a REST néha túl részletes lehet. Összetett műveletek esetén több külön endpoint használata válhat szükségessé, és nagy rendszerekben előfordulhat az úgynevezett **over-fetching** vagy **under-fetching**, amikor a kliens túl sok vagy túl kevés adatot kap egy kérésben.