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.