% 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}
