REST API¶
API портала построено на Django REST Framework и доступно по префиксу /api/.
Схема OpenAPI генерируется drf-spectacular.
Интерактивный справочник¶
Полное описание всех эндпоинтов, полей и кодов ответа генерируется из схемы и публикуется вместе с этой документацией:
Обзор эндпоинтов с пояснениями — на странице Обзор эндпоинтов.
Сгенерировать схему локально:
./manage.py spectacular --file soniks-network-api-client/openapi.yml --validate
Клиент на Python¶
Из схемы генерируется Python-клиент — каталог soniks-network-api-client/.
Это сгенерированный код, править его руками нельзя: изменения вносятся в сериализаторы
и представления, после чего клиент пересобирается джобой api в CI.
Аутентификация¶
По умолчанию для всего API включены два способа:
TokenAuthentication— токен в заголовкеAuthorization, основной способ для клиентов станций;SessionAuthentication— сессия Django, для запросов из веб-интерфейса.
Отдельно, только для публикации TLE (POST /api/tles/), дополнительно принимается
Bearer-токен через OIDC — чтобы внешний сервис мог действовать от имени пользователя.
Общепроектные классы аутентификации при этом не расширяются.
Часть эндпоинтов доступна анонимно: выдача TLE (/api/latesttles/), справочные
представления и — при JOBS_ALLOW_ANONYMOUS=True — список заданий.
В схеме OIDC-токен описан отдельным механизмом oidcAuth (тип http, схема bearer,
формат JWT): без этого drf-spectacular не смог бы разрешить OIDCAuthentication, и
в опубликованной схеме у эндпоинта не было бы ни одного способа авторизации — при том
что его единственный потребитель как раз читает схему.
Фильтрация и постраничная выдача¶
Фильтры описаны в network/api/filters.py и подключены через
DjangoFilterBackend — доступные параметры для каждого эндпоинта видны в интерактивном
справочнике. Размер страницы по умолчанию — ITEMS_PER_PAGE (25); для /api/tles/
используется курсорная постраничная выдача.
Ограничение частоты запросов¶
Лимиты включены точечно, а не глобально — DEFAULT_THROTTLE_CLASSES не задан, поэтому
неперечисленные эндпоинты не ограничиваются:
Область |
Переменная |
По умолчанию |
|---|---|---|
|
|
60/мин |
Аналитика |
|
120/мин |
Тяжёлая аналитика |
|
30/мин |
|
|
20/мин |
Список |
|
60/час, 240/час |
Список |
|
256/час |
Кадры SIDS, |
|
3600/час |
Отчёт станции, |
|
1200/час |
Авторизованный клиент считается по пользователю, поэтому все станции одного владельца
делят счётчик. /api/jobs/ не ограничен намеренно: интервал опроса у старого клиента
настраивается, а станция, которая не обновится, не должна заметить лимит. Анонимный
клиент считается по адресу — см. NUM_PROXIES в Конфигурация.
Форматы ответа¶
JSON плюс браузерный рендерер DRF без форм
(network.api.renderers.BrowsableAPIRendererWithoutForms). Выдача TLE дополнительно
поддерживает ?FORMAT=tle и ?FORMAT=json.