287 lines
8.0 KiB
TeX
287 lines
8.0 KiB
TeX
% 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}
|