API és cURL gyakorlat


1. Feladat:       Kutatómunka: Mi az a cURL, mire használják?

A kutatómunka eredményeként készítsetek egy md-t (Markdown-t). Legyen benne egy ábra, és legalább egy hivatkozás is. (Ha nem tudjátok mi az az md, nézzetek utána!)


2. Feladat:       Könyvtár API kifejlesztése Python Flask segítségével

A feladatban egy könyvtár kezelésére szolgáló REST API-t kell megvalósítani. Az API lehetővé teszi a könyvek hozzáadását, lekérdezését, frissítését és törlését.

Feladat leírása:

Készítsetek egy REST API-t, amely az alábbi funkciókat támogatja:

  1. Könyv Hozzáadása (HTTP POST /books)
  2. Könyvek Listázása (HTTP GET /books)
  3. Könyv Részleteinek Lekérdezése (HTTP GET /books/)
  4. Könyv Frissítése (HTTP PUT /books/)
  5. Könyv Törlése (HTTP DELETE /books/)

Követelmények

cURL Gyakorlat

A feladat során gyakoroljátok a cURL használatát is. A következő cURL parancsokat kell végrehajtani az API tesztelésére:


Megjegyzés - Adatok tárolása

Az elkészített könyvtár API adatai jelenleg egy Python listában tárolódnak, amely a Flask alkalmazás memóriájában él. Az adatok nem tartósak, és az alkalmazás újraindításakor elvesznek.

Későbbiekben az átmeneti tárolás helyett célszerű (fogjuk is!) az adatokat tartósan, például egy adatbázisban (pl. SQLite, MySQL...) vagy fájlban tárolni.

2. Egy egyszerű megoldás:

from flask import Flask, jsonify, request app = Flask(__name__) # Könyvek adatbázisa books = [] # Könyv Hozzáadása @app.route('/books', methods=['POST']) def add_book(): data = request.json new_book = { 'id': len(books) + 1, 'title': data['title'], 'author': data['author'], 'published_year': data['published_year'] } books.append(new_book) return jsonify(new_book), 201 # Könyvek Listázása @app.route('/books', methods=['GET']) def get_books(): return jsonify(books) # Könyv Részleteinek Lekérdezése @app.route('/books/<int:book_id>', methods=['GET']) def get_book(book_id): book = next((book for book in books if book['id'] == book_id), None) if book is not None: return jsonify(book) return jsonify({'message': 'Book not found'}), 404 # Könyv Frissítése @app.route('/books/<int:book_id>', methods=['PUT']) def update_book(book_id): data = request.json book = next((book for book in books if book['id'] == book_id), None) if book is not None: book['title'] = data['title'] book['author'] = data['author'] book['published_year'] = data['published_year'] return jsonify(book) return jsonify({'message': 'Book not found'}), 404 # Könyv Törlése @app.route('/books/<int:book_id>', methods=['DELETE']) def delete_book(book_id): global books books = [book for book in books if book['id'] != book_id] return jsonify({'message': 'Book deleted'}), 204 if __name__ == '__main__': app.run(debug=True)

3. API Tesztelése cURL-lel

A cURL eszköz segítségével tesztelhetitek az API működését a következő parancsokkal:

curl -X POST -H "Content-Type: application/json" -d '{"title": "Python Programming", "author": "John Doe", "published_year": 2021}' http://127.0.0.1:5000/books
curl http://127.0.0.1:5000/books
curl http://127.0.0.1:5000/books/1
curl -X PUT -H "Content-Type: application/json" -d '{"title": "Advanced Python", "author": "John Doe", "published_year": 2022}' http://127.0.0.1:5000/books/1
curl -X DELETE http://127.0.0.1:5000/books/1

Új feladat

Az előző feladatot készítsd el úgy, hogy az adatokat adatbázisban tárold el! (SQLite)

A CRUD végpontok és a funkciók ugyanazok mint az előző feladatban, valamint a curl tesztelést is végezd el!

Segítség a feladathoz

Importok

from flask import Flask, jsonify, request import sqlite3 import os

Importok: Flask a webszerver, sqlite3 az adatbázis kezeléshez, os a fájlok ellenőrzéséhez.

Adatbázis csatlakozás:

DATABASE = 'books.db' def get_db_connection(): conn = sqlite3.connect(DATABASE) conn.row_factory = sqlite3.Row return conn

Adatbázis csatlakozás függvény:

Inicializálás

def init_db(): if not os.path.exists(DATABASE): conn = get_db_connection() conn.execute(''' CREATE TABLE books ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, author TEXT NOT NULL, published_year INTEGER NOT NULL ) ''') conn.commit() conn.close() ... if __name__ == '__main__': init_db() app.run(debug=True)

Adatbázis inicializálása:

Az alkalmazás belépési pontja:

CRUD-ból egy műveletre példa / megoldás:

@app.route('/books', methods=['GET']) def get_books(): conn = get_db_connection() books = conn.execute('SELECT * FROM books').fetchall() conn.close() return jsonify([dict(book) for book in books])

Összes könyv listázása:



CRUD - Alapvető adatbázis műveletek

CRUD egy rövidítés, amely az négy alapvető adatbázis műveletet jelöli:

Művelет Angol Leírás HTTP metódus Adatbázis parancs
Create Létrehozás Új adat hozzáadása POST INSERT
Read Olvasás Adatok lekérdezése GET SELECT
Update Frissítés Meglévő adat módosítása PUT/PATCH UPDATE
Delete Törlés Adat eltávolítása DELETE DELETE

Gyakorlati példa a könyv API-ból

Create (Létrehozás)

@app.route('/books', methods=['POST']) def add_book(): # Új könyv hozzáadása az adatbázishoz conn.execute('INSERT INTO books (title, author, published_year) VALUES (?, ?, ?)', ...)

Használat: Új könyv felvétele a rendszerbe


Read (Olvasás)

@app.route('/books', methods=['GET']) def get_books(): # Összes könyv lekérdezése books = conn.execute('SELECT * FROM books').fetchall() @app.route('/books/<int:book_id>', methods=['GET']) def get_book(book_id): # Egy konkrét könyv lekérdezése book = conn.execute('SELECT * FROM books WHERE id = ?', (book_id,)).fetchone()

Használat: Könyvek megtekintése


Update (Frissítés)

@app.route('/books/<int:book_id>', methods=['PUT']) def update_book(book_id): # Meglévő könyv adatainak módosítása conn.execute('UPDATE books SET title = ?, author = ?, published_year = ? WHERE id = ?', ...)

Használat: Könyv adatainak megváltoztatása (pl. cím korrekciója)


Delete (Törlés)

@app.route('/books/<int:book_id>', methods=['DELETE']) def delete_book(book_id): # Könyv eltávolítása az adatbázisból conn.execute('DELETE FROM books WHERE id = ?', (book_id,))

Használat: Könyv törlése a rendszerből


Miért fontos a CRUD?

A CRUD az alapja minden adatbázis-kezelő alkalmazásnak. Szinte minden weboldal, mobil app vagy szoftver ezen alapvető műveletek kombinációjából épül fel:

Ha egy alkalmazás támogatja mind a négy műveletet, azt "teljes CRUD funkcionalitású" alkalmazásnak nevezzük.

curl -X POST -H "Content-Type: application/json" -d "{\"title\": \"Python Programming\", \"author\": \"John Doe\", \"published_year\": 2021}" http://127.0.0.1:5000/books curl -X PUT -H "Content-Type: application/json" -d "{\"title\": \"Advanced Python\", \"author\": \"John Doe\", \"published_year\": 2022}" http://127.0.0.1:5000/books/1