Тема 5 из 6

JSON-API

Сайтом пользуются люди, а API — программы: мобильное приложение, бот, JavaScript на странице. Вместо HTML они обмениваются JSON — текстом из словарей, списков, строк и чисел.

Ответ в JSON

from flask import jsonify


@app.route("/api/me")
def me():
    return {"name": "Аня", "skills": ["Python", "Flask"]}   # словарь → JSON


@app.route("/api/list")
def items():
    return jsonify([1, 2, 3])                                # список — через jsonify

Flask сам поставит заголовок Content-Type: application/json. Код ответа добавляется так же, как раньше: return {"error": "not found"}, 404.

JSON в запросе

@app.route("/api/messages", methods=["POST"])
def add():
    data = request.get_json(silent=True)
    if not isinstance(data, dict):
        return {"error": "bad request"}, 400
    ...
  • request.get_json() превращает тело запроса в Python-объект. Если тело — не JSON, Flask сам ответит ошибкой;
  • с silent=True вместо ошибки придёт None — и вы ответите своим понятным текстом;
  • тело может оказаться любым JSON: списком, числом, строкой. Поэтому проверяйте тип — isinstance(data, dict), и тип каждого поля.

Методы и коды

API обычно строят по схеме REST: адрес — это ресурс, а метод — действие над ним.

Метод Адрес Действие Успешный код
GET /api/notes список 200
POST /api/notes создать 201 Created
GET /api/notes/5 одна запись 200
PUT /api/notes/5 заменить 200
DELETE /api/notes/5 удалить 204 No Content
@app.route("/api/notes/<int:nid>", methods=["GET", "PUT", "DELETE"])
def note(nid):
    if nid not in NOTES:
        return {"error": "not found"}, 404
    if request.method == "DELETE":
        del NOTES[nid]
        return "", 204
    ...

Метод, которого нет в methods, Flask отклонит сам — кодом 405 Method Not Allowed.

Проверять API удобно тест-клиентом: client.post(url, json={...}), client.put(...), client.delete(...), а ответ в виде Python-объекта — r.get_json(). В браузере видны только GET-запросы; для остальных есть программы вроде Postman или команда curl.

Итог

  • словарь в ответе → JSON, список → jsonify;
  • request.get_json(silent=True) и проверка типов;
  • REST: GET, POST (201), PUT, DELETE (204), ошибки 400 и 404;
  • метод вне methods → 405.