% REST API alapok \section{REST API Alapok} \begin{frame}{Mi a REST API?} \begin{block}{REST - Representational State Transfer} \begin{itemize} \item Architektúra stílus webes szolgáltatásokhoz \item Roy Fielding dolgozta ki 2000-ben \item HTTP protokollon alapuló kommunikáció \item Állapotmentes (stateless) kliens-szerver kapcsolat \end{itemize} \end{block} \begin{exampleblock}{API - Application Programming Interface} Interfész, amin keresztül különböző alkalmazások kommunikálnak egymással. \end{exampleblock} \end{frame} \begin{frame}{REST alapelvek} \begin{enumerate} \item \textbf{Kliens-szerver architektúra} \begin{itemize} \item Szétválasztott felelősségek \item Kliens: felhasználói felület \item Szerver: adatkezelés, üzleti logika \end{itemize} \item \textbf{Állapotmentesség (Stateless)} \begin{itemize} \item Minden kérés független \item Szerver nem tárol kliens állapotot \end{itemize} \item \textbf{Cachelhető} \begin{itemize} \item Válaszok cache-elhetők a teljesítmény növelésére \end{itemize} \end{enumerate} \end{frame} \begin{frame}{REST alapelvek (folyt.)} \begin{enumerate} \setcounter{enumi}{3} \item \textbf{Egységes interfész} \begin{itemize} \item Erőforrások URI-kon keresztül azonosíthatók \item Reprezentációkon keresztüli manipuláció \item Önleíró üzenetek \end{itemize} \item \textbf{Rétegzett rendszer} \begin{itemize} \item Köztes rétegek (proxy, gateway) használhatók \item Kliens nem tudja, közvetlenül a szerverhez kapcsolódik-e \end{itemize} \end{enumerate} \end{frame} \begin{frame}{Erőforrások és URI-k} \begin{block}{Erőforrás (Resource)} Minden, amit azonosítani és kezelni akarunk (pl. felhasználó, termék, rendelés). \end{block} \begin{exampleblock}{URI példák} \begin{itemize} \item \texttt{/users} - Összes felhasználó \item \texttt{/users/123} - Adott felhasználó (ID: 123) \item \texttt{/users/123/posts} - Egy felhasználó posztjai \item \texttt{/products} - Összes termék \item \texttt{/products/456} - Adott termék \end{itemize} \end{exampleblock} \begin{alertblock}{Konvenció} Használj \textbf{főneveket} és \textbf{többes számot}: \texttt{/users}, \texttt{/products} \end{alertblock} \end{frame} \begin{frame}{HTTP metódusok} \begin{table} \small \begin{tabular}{|l|l|l|l|} \hline \textbf{Metódus} & \textbf{Művelet} & \textbf{Idemp.} & \textbf{Példa} \\ \hline GET & Lekérdezés & Igen & Lista/részlet \\ POST & Létrehozás & Nem & Új elem \\ PUT & Frissítés (teljes) & Igen & Teljes csere \\ PATCH & Frissítés (rész) & Nem & Rész módosítás \\ DELETE & Törlés & Igen & Elem törlése \\ \hline \end{tabular} \end{table} \vspace{0.3cm} \begin{block}{Idempotencia} Ugyanaz a kérés többször végrehajtva ugyanazt az eredményt adja. \end{block} \end{frame} \begin{frame}[fragile,shrink=10]{HTTP metódusok - GET példák} \begin{exampleblock}{Összes elem lekérdezése} \tiny \begin{verbatim} GET /api/users Response: 200 OK [ {"id": 1, "name": "Alice", "email": "alice@example.com"}, {"id": 2, "name": "Bob", "email": "bob@example.com"} ] \end{verbatim} \end{exampleblock} \begin{exampleblock}{Egy elem lekérdezése} \tiny \begin{verbatim} GET /api/users/1 Response: 200 OK {"id": 1, "name": "Alice", "email": "alice@example.com"} \end{verbatim} \end{exampleblock} \end{frame} \begin{frame}[fragile,shrink=10]{HTTP metódusok - POST, PUT} \begin{exampleblock}{POST - Új elem létrehozása} \tiny \begin{verbatim} POST /api/users Body: {"name": "Charlie", "email": "charlie@example.com"} Response: 201 Created {"id": 3, "name": "Charlie", "email": "charlie@example.com"} \end{verbatim} \end{exampleblock} \begin{exampleblock}{PUT - Teljes frissítés} \tiny \begin{verbatim} PUT /api/users/1 Body: {"name": "Alice Smith", "email": "alice.smith@example.com"} Response: 200 OK {"id": 1, "name": "Alice Smith", "email": "alice.smith@example.com"} \end{verbatim} \end{exampleblock} \end{frame} \begin{frame}[fragile,shrink=10]{HTTP metódusok - PATCH, DELETE} \begin{exampleblock}{PATCH - Részleges frissítés} \tiny \begin{verbatim} PATCH /api/users/1 Body: {"email": "newemail@example.com"} Response: 200 OK {"id": 1, "name": "Alice", "email": "newemail@example.com"} \end{verbatim} \end{exampleblock} \begin{exampleblock}{DELETE - Törlés} \tiny \begin{verbatim} DELETE /api/users/1 Response: 204 No Content \end{verbatim} \end{exampleblock} \end{frame} \begin{frame}{HTTP státuszkódok} \begin{columns} \begin{column}{0.48\textwidth} \begin{block}{2xx - Sikeres} \begin{itemize} \item \textbf{200} OK \item \textbf{201} Created \item \textbf{204} No Content \end{itemize} \end{block} \begin{block}{4xx - Kliens hiba} \begin{itemize} \item \textbf{400} Bad Request \item \textbf{401} Unauthorized \item \textbf{403} Forbidden \item \textbf{404} Not Found \end{itemize} \end{block} \end{column} \begin{column}{0.48\textwidth} \begin{block}{5xx - Szerver hiba} \begin{itemize} \item \textbf{500} Internal Error \item \textbf{502} Bad Gateway \item \textbf{503} Service Unavailable \end{itemize} \end{block} \begin{alertblock}{Fontos} Mindig a megfelelő státuszkódot küldd! \end{alertblock} \end{column} \end{columns} \end{frame} \begin{frame}[fragile,shrink=10]{JSON formátum} \begin{block}{JavaScript Object Notation} A REST API-k leggyakoribb adatformátuma. \end{block} \begin{exampleblock}{Példa} \tiny \begin{verbatim} { "id": 1, "name": "John Doe", "email": "john@example.com", "age": 30, "active": true, "roles": ["user", "admin"], "address": { "city": "Budapest", "zip": "1111" } } \end{verbatim} \end{exampleblock} \end{frame} \begin{frame}{REST vs SOAP} \begin{table} \tiny \begin{tabular}{|l|p{4cm}|p{4cm}|} \hline & \textbf{REST} & \textbf{SOAP} \\ \hline Protokoll & HTTP & HTTP, SMTP, TCP \\ Formátum & JSON, XML & Csak XML \\ Állapot & Stateless & Lehet stateful \\ Sebesség & Gyorsabb & Lassabb \\ Használat & Egyszerűbb & Komplexebb \\ \hline \end{tabular} \end{table} \vspace{0.3cm} \begin{exampleblock}{Mikor REST?} Webes és mobil alkalmazások, publikus API-k, mikroszolgáltatások \end{exampleblock} \end{frame} \begin{frame}[fragile,shrink=10]{Hibakezelés} \begin{exampleblock}{Hibaválasz struktúra} \tiny \begin{verbatim} { "error": { "code": "USER_NOT_FOUND", "message": "A megadott felhasználó nem található", "details": "User with ID 123 does not exist", "timestamp": "2026-01-27T20:30:00Z" } } \end{verbatim} \end{exampleblock} \begin{alertblock}{Best Practices} \begin{itemize} \item Mindig küldd a megfelelő HTTP státuszkódot \item Adj értelmes hibaüzeneteket \item Ne adj ki érzékeny információkat \end{itemize} \end{alertblock} \end{frame} \begin{frame}{Összefoglalás - REST Alapok} \begin{itemize} \item \textbf{REST} = Representational State Transfer (Reprezentációs Állapotátvitel) \item Architektúra stílus HTTP-n keresztül \item \textbf{Erőforrások} (Resources) URI-kon keresztül azonosíthatók \item \textbf{HTTP metódusok}: GET (olvasás), POST (létrehozás), PUT/PATCH (módosítás), DELETE (törlés) \item \textbf{Státuszkódok} (Status Codes) jelzik a kérés eredményét \item \textbf{JSON} a leggyakoribb adatformátum \item \textbf{Állapotmentes} (Stateless) kommunikáció \end{itemize} \end{frame}