12.3 REST API izstrāde

Tavs šīs stundas izaicinājums: Saprast REST principus un izveidot pareizi strukturētu API spēļu rezultātu pārvaldībai.

SR 2.4.11. Lieto standartizētas bibliotēkas un API SR 2.4.7. Lietotāja saskarne

Teorija: REST principi

REST (Representational State Transfer) ir API projektēšanas stils, kas nosaka:

MetodeURLDarbība
GET/api/speletajiSaraksts ar visiem
GET/api/speletaji/42Viens pēc ID
POST/api/speletajiIzveidot jaunu
PUT/api/speletaji/42Aizstāt visu
PATCH/api/speletaji/42Daļēji atjaunināt
DELETE/api/speletaji/42Dzēst

Pareizie statusa kodi: 200 OK, 201 Created, 204 No Content, 400 Bad Request, 401 Unauthorized, 404 Not Found, 500 Server Error.

1. uzdevums: Pilnvērtīga CRUD API

Pievieno visas 5 standartmaršrutas spēļu rezultātiem.

Izpildes soļi:

  1. Izveido app.py ar globālu sarakstu REZULTATI.
  2. GET /api/rezultati — visu sarakstu.
  3. GET /api/rezultati/<id> — viens vai 404.
  4. POST /api/rezultati — izveido jaunu (201).
  5. PUT /api/rezultati/<id> — aizstāj.
  6. DELETE /api/rezultati/<id> — dzēš (204 No Content).

2. uzdevums: Filtri un kārtošana

Pievieno query parametrus.

Izpildes soļi:

  1. GET /api/rezultati?limit=10 — TOP 10 pēc punktiem.
  2. GET /api/rezultati?spele=quiz — tikai "quiz" spēles rezultāti.
  3. GET /api/rezultati?kartot=datums — pēc datuma.
  4. Implementē, lasot request.args.get("limit", default=100, type=int).

3. uzdevums: Validācija un kļūdu apstrāde

Pārliecinies, ka API nevar "saplēst".

Izpildes soļi:

  1. POST: validē vards nav tukšs un punkti >= 0; atgriež 400 ar specifisku kļūdas tekstu.
  2. Visiem maršrutiem pievieno try/except: ja kļūda, atgriež 500 ar paziņojumu.
  3. Pievieno globālu kļūdu apstrādātāju @app.errorhandler(404), kas atgriež JSON, ne HTML.
  4. Testē ar curl, sūtot nederīgus datus.
  5. Sadali kodu moduļos: app.py, models.py, validators.py.

Papildus uzdevums: OpenAPI dokumentācija

Automātiskā API dokumentācija.

Izpildes soļi:

  1. pip install flask-smorest
  2. Pievieno automātisku Swagger UI savai API.
  3. Atver http://localhost:5000/swagger-ui un izpēti dokumentāciju.

Biežākās kļūdas

Koda piemērs

from flask import Flask, jsonify, request, abort

app = Flask(__name__)
REZULTATI = []

@app.route("/api/rezultati", methods=["GET"])
def saraksts():
    limit = request.args.get("limit", 100, type=int)
    sakartoti = sorted(REZULTATI, key=lambda r: r["punkti"], reverse=True)
    return jsonify(sakartoti[:limit])

@app.route("/api/rezultati", methods=["POST"])
def jauns():
    d = request.json or {}
    if not d.get("vards"): return jsonify({"kluda": "Trūkst vārds"}), 400
    if d.get("punkti", 0) < 0: return jsonify({"kluda": "Negatīvi punkti"}), 400
    d["id"] = len(REZULTATI) + 1
    REZULTATI.append(d)
    return jsonify(d), 201

@app.errorhandler(404)
def not_found(e):
    return jsonify({"kluda": "Nav atrasts"}), 404
POST → 201 Created
GET ?limit=5 → top 5
404 → {kluda: 'Nav atrasts'}
⬅ Iepriekšējā stunda Nākamā stunda ➡