API-k használata és tesztelése közvetlenül a Jupyter Notebookból

A modern szoftverfejlesztés elválaszthatatlan részét képezik az API-k (Application Programming Interfaces), amelyek lehetővé teszik különböző alkalmazások és rendszerek közötti kommunikációt. Gondoljunk csak bele: amikor egy mobilalkalmazás lekéri az időjárás-előrejelzést, vagy egy weboldal friss részvényárfolyamokat jelenít meg, szinte biztosan egy API-n keresztül történik a háttérben. Az API-k ereje abban rejlik, hogy standardizált módon, programozottan férhetünk hozzá adatokhoz és funkciókhoz anélkül, hogy ismernünk kellene a mögöttes rendszer belső működését. Ebben a cikkben mélyebben belemerülünk abba, hogyan használhatjuk és tesztelhetjük ezeket az interféceket – méghozzá nem is akárhol, hanem az interaktív és sokoldalú Jupyter Notebook környezetben.

A Jupyter Notebook egy nyílt forráskódú webes alkalmazás, amely lehetővé teszi, hogy élő kódot, egyenleteket, vizualizációkat és magyarázó szöveget tartalmazó dokumentumokat hozzunk létre és oszthassunk meg. Ez a platform kiválóan alkalmas adatfeldolgozásra, gépi tanulásra, tudományos számításokra, de mint látni fogjuk, az API-k kipróbálására és tesztelésére is rendkívül hatékony eszközt nyújt. A Notebook interaktív jellege miatt azonnal láthatjuk a kéréseink eredményét, ami felgyorsítja a fejlesztési és hibakeresési folyamatot.

Miért Éppen Jupyter Notebook az API-khoz?

A Jupyter Notebook számos előnnyel jár, ha API-kkal dolgozunk:

  • Interaktivitás és iteratív fejlesztés: A cellákra bontott kód futtatása lehetővé teszi, hogy apró lépésekben haladjunk. Egy-egy kérés paramétereit módosíthatjuk, és azonnal újra futtathatjuk a cellát, látva a változások hatását. Ez különösen hasznos az API-k dokumentációjának felfedezésekor és a megfelelő kérések összeállításakor.
  • Kód, kimenet és dokumentáció egy helyen: A Jupyter dokumentumok (.ipynb fájlok) tartalmazzák a futtatható kódot, annak kimenetét (beleértve a kapott API válaszokat is), és magyarázó szövegeket (Markdown formátumban). Ezáltal egy önmagában is érthető, reprodukálható „API-kézikönyvet” hozhatunk létre, ami megkönnyíti a későbbi felülvizsgálatot vagy a kollégákkal való megosztást.
  • Adatvizualizáció: Az API-król kapott adatokat azonnal feldolgozhatjuk és vizualizálhatjuk beépített könyvtárak (pl. matplotlib, seaborn, pandas) segítségével. Ez segít az adatok strukturájának és tartalmának gyors megértésében.
  • Gyors prototípus-készítés: Nincs szükség külön projektstruktúra felépítésére vagy komplex tesztkörnyezetek konfigurálására. Egyszerűen megnyitunk egy Notebookot, és máris elkezdhetjük az API-hívásokat.
  • Megoszthatóság: A Notebook fájlokat könnyedén megoszthatjuk másokkal, akik aztán saját környezetükben futtathatják és módosíthatják azokat. Ez kiválóan alkalmas API-használati példák vagy tesztszkriptek terjesztésére.

API-k Alapjai: Amit Tudni Érdemes

Mielőtt rátérnénk a gyakorlati megvalósításra, tekintsük át röviden az API-k működésének alapjait, különös tekintettel a RESTful API-kra, amelyekkel a leggyakrabban találkozunk:

  • HTTP metódusok: Ezek határozzák meg a kérés típusát. A leggyakoribbak:
    • GET: Adatok lekérdezése a szerverről.
    • POST: Új erőforrás létrehozása a szerveren, adatok küldése.
    • PUT: Egy meglévő erőforrás frissítése (teljes felülírás).
    • PATCH: Egy meglévő erőforrás részleges frissítése.
    • DELETE: Egy erőforrás törlése.
  • Végpontok (Endpoints): Az API azon URL-jei, amelyekhez a kéréseinket intézzük (pl. https://api.example.com/users).
  • Kérés (Request): A kliens (esetünkben a Jupyter Notebookban futó Python kód) által küldött üzenet a szervernek. Tartalmazza a metódust, az URL-t, fejléceket (Headers), és opcionálisan egy törzset (Body) vagy paramétereket.
  • Válasz (Response): A szerver által küldött üzenet a kliensnek. Tartalmazza a státuszkódot (pl. 200 OK, 404 Not Found, 500 Internal Server Error), fejléceket és a válasz törzsét, amely általában JSON vagy XML formátumú adatokat tartalmaz.
  • Autentikáció és Autorizáció: A legtöbb API-hoz hitelesítés szükséges. Ez történhet API kulcsokkal, OAuth tokenekkel, JWT-vel (JSON Web Token) vagy más módszerekkel. A megfelelő hitelesítési adatokat általában a kérés fejlécében (Headers) vagy lekérdezési paraméterként (Query Parameters) kell elküldeni.

Előkészületek: A Környezet Beállítása

A Jupyter Notebook használatához először is telepítenünk kell a Python-t és magát a Jupytert. A legegyszerűbb módja ennek az Anaconda disztribúció telepítése, amely már tartalmazza a Jupytert és számos tudományos könyvtárat. Miután ez megvan, nyissunk meg egy terminált, és indítsuk el a Jupytert a következő paranccsal:

jupyter notebook

Ez elindít egy helyi szervert, és megnyitja a böngészőben a Jupyter felületét. Itt létrehozhatunk egy új Python 3 Notebookot.
A legfontosabb Python könyvtár az API-k kezeléséhez a requests. Telepítsük, ha még nem lenne meg:

pip install requests

Egyéb hasznos könyvtárak lehetnek még: json (a beépített JSON kezeléshez), pandas (adatstruktúrákhoz), matplotlib és seaborn (vizualizációhoz).

API-k Használata a Jupyterben: Gyakorlati Példák

Most nézzünk meg néhány konkrét példát arra, hogyan küldhetünk kéréseket és dolgozhatjuk fel a válaszokat.

1. Egyszerű GET Kérés

Kezdjük egy alapvető GET kéréssel, amellyel adatokat kérünk le. Használjuk a JSONPlaceholder nevű ingyenes, mock REST API-t, amely tesztelési célokra ideális.

import requests
import json

# Egy egyszerű GET kérés egy nyilvános API végponthoz
url = "https://jsonplaceholder.typicode.com/posts/1"
response = requests.get(url)

# Ellenőrizzük a státuszkódot
if response.status_code == 200:
    # A válasz tartalmát JSON formátumban kérjük le
    data = response.json()
    print("Sikeres lekérdezés!")
    print(json.dumps(data, indent=2)) # Szépen formázva kiírjuk a JSON-t
else:
    print(f"Hiba történt: {response.status_code} - {response.text}")

Ez a kód lekéri az első bejegyzést a JSONPlaceholder API-ról. A response.json() metódus automatikusan elemzi a JSON választ egy Python szótárrá, ami nagyon kényelmes az adatok feldolgozásához.

2. Paraméterek Kezelése

Sok API lehetővé teszi a lekérdezés szűkítését vagy módosítását lekérdezési paraméterek (query parameters) segítségével. Ezeket a params argumentummal adhatjuk meg a requests metódusainak.

url = "https://jsonplaceholder.typicode.com/comments"
params = {
    "postId": 1 # A "postId" paraméterrel szűrünk az 1-es azonosítójú bejegyzés kommentjeire
}

response = requests.get(url, params=params)

if response.status_code == 200:
    comments = response.json()
    print(f"Sikeres lekérdezés, {len(comments)} komment található:")
    for comment in comments[:3]: # Csak az első 3 kommentet írjuk ki a rendezettség kedvéért
        print(f"  - {comment['email']}: {comment['body'][:50]}...")
else:
    print(f"Hiba történt: {response.status_code} - {response.text}")

Láthatjuk, hogy a requests könyvtár automatikusan kezeli a paraméterek URL-hez való hozzáadását (pl. ...?postId=1).

3. POST Kérés: Adatok Küldése

POST kérésekkel adatokat küldünk a szervernek, például új erőforrás létrehozásához. A küldendő adatokat a json argumentumban adhatjuk meg egy Python szótárként.

url = "https://jsonplaceholder.typicode.com/posts"
new_post = {
    "title": "Jupyter Notebook API Teszt",
    "body": "Ez egy új bejegyzés, amelyet a Jupyterből küldtem.",
    "userId": 1
}

response = requests.post(url, json=new_post)

if response.status_code == 201: # 201 Created státuszkód jelzi a sikeres létrehozást
    created_post = response.json()
    print("Sikeresen létrehoztam egy új bejegyzést!")
    print(json.dumps(created_post, indent=2))
else:
    print(f"Hiba történt a bejegyzés létrehozásakor: {response.status_code} - {response.text}")

A szerver visszaadja az újonnan létrehozott erőforrás adatait, beleértve egy egyedi azonosítót (id), ami megerősíti a művelet sikerességét.

4. Autentikáció

A legtöbb valós API-hoz autentikációra van szükség. Ez általában a kérés fejléceiben (headers) történik. Például egy API kulcsot így adhatunk át:

# FIGYELEM: Soha ne tegyél érzékeny adatokat (pl. API kulcsokat) közvetlenül a kódba
# Éles környezetben környezeti változókból olvasd be, vagy más biztonságos módszert használj!

api_key = "az_én_szuper_titkos_api_kulcsom" # Ez csak egy példa!
headers = {
    "Authorization": f"Bearer {api_key}", # Gyakori token-alapú autentikáció
    "X-API-Key": api_key, # Más API-k ilyen fejlécet várhatnak
    "Content-Type": "application/json"
}

# Egy fiktív autentikált API hívás
auth_url = "https://api.mysecuredservice.com/data"
response = requests.get(auth_url, headers=headers)

if response.status_code == 200:
    print("Sikeresen lekérdeztem az autentikált adatokat.")
else:
    print(f"Autentikációs hiba vagy más probléma: {response.status_code} - {response.text}")

A requests könyvtár támogatja a különféle autentikációs mechanizmusokat, beleértve az OAuth-t is, amihez további könyvtárakra (pl. requests_oauthlib) lehet szükség.

5. Hibakezelés és Státuszkódok

Alapvető fontosságú a hibák kezelése. A response.status_code ellenőrzése elengedhetetlen. A requests könyvtár a response.raise_for_status() metódust is kínálja, amely HTTPError-t dob, ha a státuszkód hibát jelez (pl. 4xx vagy 5xx).

url = "https://jsonplaceholder.typicode.com/nonexistent-path" # Egy nem létező végpont

try:
    response = requests.get(url)
    response.raise_for_status() # Hiba esetén kivételt dob
    data = response.json()
    print("Sikeres lekérdezés!")
except requests.exceptions.HTTPError as errh:
    print(f"HTTP Hiba történt: {errh}")
except requests.exceptions.ConnectionError as errc:
    print(f"Kapcsolati Hiba történt: {errc}")
except requests.exceptions.Timeout as errt:
    print(f"Időtúllépési Hiba történt: {errt}")
except requests.exceptions.RequestException as err:
    print(f"Valami ismeretlen hiba történt: {err}")

6. Adatok Feldolgozása és Vizualizációja

A Jupyter Notebook igazi ereje abban mutatkozik meg, ahogy az API-ról kapott adatokat azonnal elemezni és vizualizálni tudjuk. Tegyük fel, hogy lekérdeztük az összes bejegyzést, és meg akarjuk nézni, melyik felhasználó hány bejegyzést írt.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

url = "https://jsonplaceholder.typicode.com/posts"
response = requests.get(url)
response.raise_for_status()
posts = response.json()

# Konvertáljuk az adatokat Pandas DataFrame-mé
df = pd.DataFrame(posts)

# Csoportosítsuk userId szerint és számoljuk meg a bejegyzéseket
post_counts = df['userId'].value_counts().sort_index()

# Vizualizáljuk az eredményt
plt.figure(figsize=(10, 6))
sns.barplot(x=post_counts.index, y=post_counts.values)
plt.title('Bejegyzések száma felhasználónként')
plt.xlabel('Felhasználó ID')
plt.ylabel('Bejegyzések száma')
plt.grid(axis='y', linestyle='--')
plt.show()

Ez a példa demonstrálja, hogyan alakíthatjuk az API válaszát táblázatos adatokká a pandas segítségével, majd hogyan hozhatunk létre egy egyszerű oszlopdiagramot a matplotlib és seaborn könyvtárakkal, mindezt ugyanabban a Notebookban.

API-k Tesztelése a Jupyterben

A Jupyter Notebook nemcsak a használatra, hanem az API-k tesztelésére is kiválóan alkalmas. Bár nem helyettesíti a dedikált unit vagy integrációs tesztkeretrendszereket, a gyors, iteratív teszteléshez és az API viselkedésének felméréséhez ideális.

1. Válaszok Validálása és Elvárások Kezelése

Minden kérés után ellenőrizhetjük, hogy a válasz megfelel-e az elvárásainknak.

# Teszt 1: Egy felhasználó bejegyzéseinek lekérdezése
user_id_to_test = 5
url = f"https://jsonplaceholder.typicode.com/users/{user_id_to_test}/posts"
response = requests.get(url)

assert response.status_code == 200, f"Várható státuszkód 200, kapott: {response.status_code}"
assert len(response.json()) > 0, "A felhasználónak lennie kellene bejegyzéseinek"
print(f"Teszt 1 sikeres: {user_id_to_test} felhasználó bejegyzései lekérdezve.")

# Teszt 2: Nem létező bejegyzés lekérdezése
non_existent_post_id = 99999
url = f"https://jsonplaceholder.typicode.com/posts/{non_existent_post_id}"
response = requests.get(url)

assert response.status_code == 404, f"Várható státuszkód 404, kapott: {response.status_code}"
assert response.json() == {}, "A választestnek üres szótárnak kell lennie nem létező erőforrás esetén"
print(f"Teszt 2 sikeres: Nem létező bejegyzés kezelése validálva.")

Az assert kulcsszóval közvetlenül a kódban adhatunk meg feltételeket. Ha egy feltétel nem teljesül, az AssertionError kivételt dob, jelezve a teszt hibáját.

2. Iteratív Tesztelés és Edge Esetek

A Jupyter Notebook cellái lehetővé teszik a paraméterek gyors módosítását és a kérés azonnali újrafuttatását. Ez ideális az „edge case-ek” (határesetek) tesztelésére, például null értékek, érvénytelen adatformátumok vagy nagyon hosszú stringek küldésére.

# Teszteljük egy POST kérés validációját érvénytelen adatokkal
invalid_post = {
    "title": "", # Üres cím
    "body": "Ez egy érvénytelen bejegyzés.",
    "userId": "szöveg_a_szám_helyett" # Hibás típus
}
url = "https://jsonplaceholder.typicode.com/posts"
response = requests.post(url, json=invalid_post)

# A JSONPlaceholder API nem végez szigorú validációt, de egy valós API itt valószínűleg 400 Bad Request-et adna vissza.
# Feltételezzük, hogy egy valós API itt 400-at adna:
if response.status_code == 400:
    print("Sikeresen teszteltük az érvénytelen adatok kezelését (400 Bad Request várható).")
    # print(response.json()) a hiba részleteiért
else:
    print(f"Váratlan státuszkód érvénytelen adatokkal: {response.status_code}")

Haladó Tippek és Jó Gyakorlatok

  • Környezeti változók: Soha ne írj érzékeny adatokat (API kulcsok, jelszavak) közvetlenül a Notebook kódjába! Használj környezeti változókat (pl. os.environ.get('API_KEY')), amelyeket a rendszeren vagy egy .env fájlban tárolsz.
  • Session objektum használata: Ha több kérést küldesz ugyanarra az API-ra, érdemes egy requests.Session() objektumot használni. Ez optimalizálja a teljesítményt, mivel újra felhasználja a TCP kapcsolatokat, és lehetővé teszi a fejlécek és sütik megőrzését a kérések között.
    s = requests.Session()
    s.headers.update({'Authorization': 'Bearer YOUR_TOKEN'})
    response1 = s.get('https://api.example.com/data1')
    response2 = s.post('https://api.example.com/data2', json={'key': 'value'})
            
  • Időtúllépés (Timeout): Mindig állíts be időtúllépést a kérésekhez, hogy elkerüld a végtelen várakozást, ha a szerver nem válaszol.
    response = requests.get(url, timeout=5) # 5 másodperc után időtúllépés
            
  • Rate Limiting kezelése: Sok API korlátozza, hogy mennyi kérést küldhetsz egy adott időn belül. Figyelj a válasz fejléceire (pl. X-RateLimit-Remaining, Retry-After), és építs be várakozási logikát (pl. time.sleep()) a kódodba, ha szükséges.
  • Kód rendszerezése: Ha a Notebook kódja komplexebbé válik, szervezd függvényekbe vagy akár osztályokba a logikát, hogy az olvashatóbb és karbantarthatóbb legyen.
  • Dokumentáció olvasása: Az API dokumentációja a legjobb barátod. Mindig olvasd el figyelmesen, mielőtt elkezdesz dolgozni egy API-val, hogy megértsd a végpontokat, paramétereket, hitelesítési mechanizmusokat és válaszformátumokat.

Gyakori Kihívások és Megoldások

  • Kapcsolati hibák (Connection Errors): Ellenőrizd az internetkapcsolatot, az URL helyességét, és hogy az API szervere elérhető-e.
  • Autentikációs problémák (401 Unauthorized, 403 Forbidden): Győződj meg róla, hogy helyes az API kulcsod/tokened, és megfelelően adod át a fejlécben vagy paraméterként. Ellenőrizd az API dokumentációját a pontos mechanizmusért.
  • Helytelen adatformátum (400 Bad Request, 422 Unprocessable Entity): Gyakran előfordul POST vagy PUT kéréseknél, ha az elküldött adat (payload) formátuma vagy tartalma nem felel meg az API elvárásainak. Nézd át a küldött JSON-t/XML-t, és hasonlítsd össze a dokumentációban leírtakkal.
  • Nem található erőforrás (404 Not Found): Ellenőrizd az URL-t és a végpontot. Lehet, hogy hibás az azonosító, amit átadtál (pl. egy bejegyzés ID-ja).
  • Szerveroldali hibák (5xx Internal Server Error): Ez az API szolgáltató oldalán felmerülő problémát jelez. Ilyenkor a legjobb, ha ellenőrzöd az API státuszoldalát, vagy felveszed a kapcsolatot a szolgáltatóval.

Összegzés

A Jupyter Notebook egy rendkívül sokoldalú és hatékony eszköz az API-k használatára és tesztelésére. Interaktív környezete, az azonnali visszajelzés lehetősége, valamint a kód, a kimenet és a magyarázat egy helyen való kezelése felbecsülhetetlen értékűvé teszi a fejlesztési folyamat során. Akár adatok gyűjtéséről, szolgáltatások integrálásáról, vagy egy új API kipróbálásáról van szó, a Jupyter jelentősen felgyorsíthatja a munkát és javíthatja az érthetőséget.

A bemutatott példák és tippek segítségével remélhetőleg magabiztosabban fogsz nekilátni az API-kkal való munkának a Jupyter Notebookban. Ne feledd: a gyakorlás teszi a mestert! Kísérletezz különböző API-kkal, fedezz fel új végpontokat, és építsd be a tanultakat a mindennapi munkafolyamataidba. A Python requests könyvtára és a Jupyter Notebook párosa egy igazi erőmű a kezedben, amellyel bármilyen API-t meghódíthatsz.

Leave a Reply

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük