4API — граница между программами
API (Application Programming Interface) — интерфейс, через который одна программа взаимодействует с другой.
Например, веб-интерфейс службы поддержки запрашивает у сервера список обращений:
Frontend→GET /api/v1/tickets→Backend→JSON
Клиенту не требуется знать:
- язык, на котором написан backend;
- структуру базы данных;
- внутренние классы;
- алгоритмы сервера.
Клиент должен знать только контракт API.
- FRONTENDHTTP
- PUBLIC APIто, что видит клиент
- INTERNAL CODE · DATABASEможно менять, не нарушая контракт
5Что происходит при обращении к API
Обмен всегда состоит из двух сообщений: клиент отправляет HTTP request, сервер обрабатывает его и возвращает HTTP response.
HTTP request
GET /api/v1/tickets/42
HTTP response
200 OK
Content-Type: application/json
{
"id": 42,
"title": "Не работает VPN",
"status": "open"
}
Здесь клиент просит обращение с идентификатором 42. Сервер отвечает кодом 200 OK, сообщает формат тела и передаёт само обращение в JSON.
- CLIENT
- HTTP REQUESTметод и адрес
- SERVER
- HTTP RESPONSEкод, заголовки, тело
- CLIENT
6Анатомия HTTP-запроса
HTTP request может содержать метод, URL, заголовки, query parameters и тело. Нажмите на часть в легенде, чтобы увидеть её в запросе.
Authorization: Bearer TOKEN
headerContent-Type: application/json
header{
"title": "Не работает VPN",
"description": "Ошибка после обновления"
}bodyВ настоящем сообщении метод и путь записаны в одной строке: POST /api/v1/tickets HTTP/1.1. Здесь они разнесены, чтобы подписать каждую часть отдельно.
7Анатомия ответа
Ответ сервера содержит status code, заголовки и тело.
Location: /api/v1/tickets/8d45...
headerContent-Type: application/json
header{
"id": "8d45...",
"title": "Не работает VPN",
"status": "open"
}body201 сообщает машине результат операции, а JSON содержит данные созданного ресурса.
8REST работает вокруг ресурсов
Ресурс — сущность предметной области, которой API предоставляет адрес.
В нашем проекте ресурс — Ticket, обращение в службу поддержки.
| Что | Адрес |
|---|
| Коллекция обращений | /api/v1/tickets |
| Конкретное обращение | /api/v1/tickets/{ticket_id} |
URL описывает, что это за ресурс, а HTTP-метод — что с ним требуется сделать.
tickets
│
├── 41
├── 42
└── 43