Введение в REST API
Зачем нужен API
До сих пор наш блог отдавал HTML — готовые страницы для браузера. Но данные блога могут понадобиться и другим программам:
- мобильному приложению;
- фронтенду на React или Vue;
- другому сервису (например, боту в Telegram, который публикует новые посты).
Им не нужен HTML с меню и стилями — им нужны данные. Для этого делают API (Application Programming Interface) — интерфейс, через который программы обмениваются данными.
Что такое REST
REST (Representational State Transfer) — набор принципов построения API поверх HTTP. Главные идеи:
- Ресурсы. Всё, с чем работает API, — ресурсы: посты, комментарии, пользователи. У каждого ресурса есть адрес (URL).
- Методы HTTP задают действие. Не
/getPosts/и/deletePost/, аGET /posts/иDELETE /posts/5/. - Представления. Ресурс передаётся в каком-то формате — обычно JSON.
- Без состояния. Каждый запрос самодостаточен: сервер не хранит «сессию разговора», клиент передаёт всё нужное (например, токен) в каждом запросе.
- Единообразие. Одинаковые правила для всех ресурсов — API легко изучить.
Ресурсы и адреса
| Метод | Адрес | Действие | Успешный ответ |
|---|---|---|---|
GET |
/api/posts/ |
Список постов | 200 OK |
POST |
/api/posts/ |
Создать пост | 201 Created |
GET |
/api/posts/5/ |
Получить пост 5 | 200 OK |
PUT |
/api/posts/5/ |
Заменить пост целиком | 200 OK |
PATCH |
/api/posts/5/ |
Изменить часть полей | 200 OK |
DELETE |
/api/posts/5/ |
Удалить пост | 204 No Content |
GET |
/api/posts/5/comments/ |
Комментарии поста | 200 OK |
Правила именования: существительные во множественном числе, строчные буквы, вложенность для связанных ресурсов, фильтры — через параметры (/api/posts/?tag=django&page=2).
Коды ответов
| Код | Когда |
|---|---|
200 OK |
Успешный запрос |
201 Created |
Объект создан |
204 No Content |
Успех без тела (удаление) |
400 Bad Request |
Ошибка в данных (валидация) |
401 Unauthorized |
Не передана или неверна аутентификация |
403 Forbidden |
Аутентифицирован, но нет прав |
404 Not Found |
Ресурс не найден |
405 Method Not Allowed |
Метод не поддерживается |
429 Too Many Requests |
Превышен лимит запросов |
500 Internal Server Error |
Ошибка на сервере |
JSON
JSON (JavaScript Object Notation) — текстовый формат данных:
{
"id": 5,
"title": "Привет, API",
"author": {"id": 1, "username": "admin"},
"tags": ["django", "rest"],
"published": true,
"rating": null
}
Правила: ключи и строки — только в двойных кавычках, true/false/null — строчными буквами, нет комментариев и висячих запятых. В Python JSON читается и пишется модулем json: объект → dict, массив → list, null → None.
Пример обмена
Запрос:
POST /api/posts/ HTTP/1.1
Host: myblog.ru
Content-Type: application/json
Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b
{"title": "Новый пост", "body": "Текст"}
Ответ:
HTTP/1.1 201 Created
Content-Type: application/json
{"id": 42, "title": "Новый пост", "body": "Текст", "author": "admin"}
Как пощупать API
- Браузер — для GET-запросов.
- curl в терминале:
curl https://api.github.com/repos/django/django
curl -X POST -H "Content-Type: application/json" -d '{"title": "Тест"}' http://127.0.0.1:8000/api/posts/
- HTTPie (
http GET ...) — более удобный curl. - Postman или Insomnia — графические клиенты.
- Python — библиотека
requests:
import requests
resp = requests.get("https://api.github.com/repos/django/django")
print(resp.status_code, resp.json()["stargazers_count"])
Можно ли без фреймворка?
Да — вы уже видели JsonResponse:
def post_list_api(request):
posts = Post.published.values("id", "title", "publish")
return JsonResponse({"results": list(posts)})
Но как только появляются создание и валидация, вложенные объекты, права, пагинация, токены и документация, код разрастается. Поэтому в мире Django стандарт — Django REST Framework (DRF), с которым мы начнём работать в следующем уроке.
Итог
- API отдаёт данные (обычно JSON), а не HTML.
- REST: ресурсы с адресами + методы HTTP как действия + коды ответов + отсутствие состояния.
- Хорошие адреса — существительные во множественном числе:
/api/posts/5/. - Для Django стандарт построения API — Django REST Framework.
Практика решено 0 из 6
Что возвращает типичный REST API в ответ на запрос?
Сопоставьте действия с постами и HTTP-запросы: расставьте в порядке «список, создать, получить один, частично изменить, удалить».
-
DELETE /api/posts/5/ -
POST /api/posts/ -
GET /api/posts/ -
GET /api/posts/5/ -
PATCH /api/posts/5/
Какой код ответа правильно вернуть после успешного создания объекта через POST?
Какие адреса соответствуют принципам REST?
Напишите JSON-объект поста с полями: id = 5, title = "Привет, API", tags — массив из строк "django" и "rest",
published = true.
{
"id": 5,
"title": "Привет, API",
"tags": ["django", "rest"],
"published": true
}
Что значит, что REST API «не хранит состояние» (stateless)?
Войдите, чтобы отмечать пройденные уроки.