1. Основы API, HTTP и форматы данных
Основы API, HTTP и форматы данных
Что такое API и зачем оно нужно
API (Application Programming Interface, программный интерфейс приложения) — это набор правил, по которым одна программа может взаимодействовать с другой.
Простая аналогия:
В рамках курса мы в первую очередь будем работать с Web API — API, доступными по сети (обычно через интернет) и использующими HTTP.
Типичные задачи, решаемые через API:
!Общая схема запроса и ответа при работе с Web API
HTTP как основа Web API
HTTP (Hypertext Transfer Protocol) — протокол, то есть набор правил передачи данных в интернете.
> "The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems." (RFC 9110)
Ключевые свойства HTTP:
Из чего состоит HTTP-запрос
HTTP-запрос обычно включает:
POST, PUT, PATCH)Пример (схематично):
Из чего состоит HTTP-ответ
HTTP-ответ обычно включает:
Пример (схематично):
!Из каких частей состоят HTTP-запрос и HTTP-ответ
URL, путь и параметры
URL — адрес ресурса. В Web API под ресурсом обычно понимают сущность, с которой мы работаем: пользователь, заказ, товар.
Пример URL:
https://api.example.com/v1/users/42?verbose=true
Разберём компоненты:
https — схема (протокол поверх TLS)api.example.com — домен (хост)/v1/users/42 — путь (path), часто отражает ресурс и его идентификаторverbose=true — query-параметры (параметры строки запроса), обычно для фильтрации, сортировки, пагинацииВажно различать:
/users/42) — какой конкретно ресурс?limit=10&offset=20) — как именно получить/показать данныеМетоды HTTP и их смысл
Метод (иногда говорят verb) описывает намерение клиента.
Основные методы, которые чаще всего встречаются в API:
| Метод | Типичный смысл | Есть тело запроса | Идемпотентность |
|---|---|---:|---|
| GET | Получить данные | Обычно нет | Да |
| POST | Создать ресурс / выполнить действие | Да | Обычно нет |
| PUT | Полностью заменить ресурс | Да | Да |
| PATCH | Частично изменить ресурс | Да | Часто да, но зависит от реализации |
| DELETE | Удалить ресурс | Обычно нет | Да |
Идемпотентность означает: если выполнить один и тот же запрос несколько раз подряд, итоговое состояние на сервере будет одинаковым. Например:
DELETE /users/42 дважды подряд в идеальном случае приводит к одному состоянию: пользователя нетPOST /orders дважды подряд обычно создаст два заказа, то есть состояние изменится дваждыКоды статуса HTTP
Код статуса — это короткий числовой результат выполнения запроса. Важно уметь читать его смысл, чтобы правильно обрабатывать ошибки в коде.
Основные группы:
Часто используемые коды:
| Код | Название | Когда встречается |
|---:|---|---|
| 200 | OK | Успешный запрос (часто GET) |
| 201 | Created | Ресурс создан (часто POST) |
| 204 | No Content | Успешно, но без тела ответа (например, DELETE) |
| 400 | Bad Request | Некорректные данные запроса |
| 401 | Unauthorized | Нужна аутентификация (не передали или неверный токен) |
| 403 | Forbidden | Доступ запрещён (прав недостаточно) |
| 404 | Not Found | Ресурс не найден |
| 409 | Conflict | Конфликт состояния (например, дубль уникального значения) |
| 429 | Too Many Requests | Превышен лимит запросов (rate limit) |
| 500 | Internal Server Error | Ошибка на стороне сервера |
Практическое правило: при работе в Python вы почти всегда будете сначала проверять код статуса, а уже потом разбирать тело ответа.
Заголовки HTTP: Content-Type и Accept
Заголовки (headers) — пары вида Ключ: Значение.
Два самых важных заголовка для форматов данных:
Content-Type — в каком формате отправлены данные (в запросе или ответе)Accept — какой формат клиент хочет получить в ответеПримеры:
Content-Type: application/json — тело сообщения в JSONAccept: application/json — клиент предпочитает JSON в ответеПолезно помнить:
Content-TypeAccept помогает договориться о формате ответаФорматы данных в API
JSON
JSON (JavaScript Object Notation) — самый популярный формат в Web API. Он человекочитаемый, легко парсится и почти напрямую ложится на структуры данных.
Основные элементы JSON:
{ "key": "value" }[1, 2, 3]true/false, nullПример JSON-ответа:
Что важно на практике:
null, который обычно соответствует None в Pythonint и float так строго, как типы в некоторых языкахСтандарт: JSON (RFC 8259)
XML
XML — более старый и многословный формат, но он всё ещё встречается в корпоративных системах, интеграциях и некоторых государственных сервисах.
Пример:
Отличия от JSON:
form-encoded и multipart/form-data
Иногда API принимает данные как HTML-форму.
Два популярных варианта:
application/x-www-form-urlencodedmultipart/form-dataПризнаки в заголовках:
Content-Type: application/x-www-form-urlencodedContent-Type: multipart/form-data; boundary=...Текстовые форматы
Иногда ответ может быть просто текстом:
Content-Type: text/plain; charset=utf-8Такое бывает, например, в простых сервисах или для отладочных endpoints.
Кодировка текста и charset
Когда вы отправляете или получаете текст, важно, в какой он кодировке.
Content-Type, например: application/json; charset=utf-8Почему это важно:
requests) часть проблем решается автоматически, но заголовки всё равно стоит пониматьОшибки API: как они обычно выглядят
Помимо кода статуса, многие API возвращают структурированное описание ошибки, часто в JSON.
Типичный пример:
Хорошая практика при разработке клиента:
Мини-словарь терминов
GET /v1/usersЧто дальше в курсе
Дальше вы начнёте применять эти основы в Python:
Эти знания — фундамент: без понимания HTTP и форматов данных любая работа с API превращается в "магические" вызовы библиотек, которые сложно отлаживать и поддерживать.