Устройство API¶
HTTP заголовки запроса¶
Каждый запрос может быть сопровожден следующими заголовками:
Accept - формат данных. Например
Accept: application/jsonAuthorization - авторизационный токен.
Authorization: OAuth {token}X-UID - uid пользователя (смотри раздел Внутренние клиенты (TVM))
X-USER-IP - ipv4/ipv6 исходного клиента (смотри раздел Внутренние клиенты (TVM))
X-Request-ID - идентификатор запроса. Не более 60 символов. Валидация по регулярному выражению
^[\w\d-]+$X-Debug - включение логирования отладочной информации: времени работы определенных участков кода, используемых соединений к базе и т.п.
HTTP заголовки ответа¶
Нужно отметить некоторые заголовки ответа:
Content-Type - всегда
application/json; charset=utf-8WWW-Authenticate - в случае проблем с авторизацией предоставляет информацию о ошибке для клиентов. Например
WWW-Authenticate: OAuth error='expired_token'Link - заголовок с информацией для пагинации. Удобно использовать в продвинутых клиентах (например, python-requests)
X-Revision - номер ревизии организации. Сейчас поббержано только в get users
X-Request-ID - идентификатор запроса. Если не передан в момент выполнения запроса, то вернется рандомно сгенерированная строка
Версионирование¶
Нужную версию API можно запросить с помощью указания префикса версии в пути, например: /v2/users/.
В данный момент по умолчанию отдаётся первая версия ручек (v1), но в будущем указание номера версии будет требоваться в обязательном порядке.
Формат полей¶
Даты представлены по стандарту iso-8601 в UTC.
Каждая сущность (пользователь, группа, ресурс…) имеет поле id, которое уникально в рамках сущностей этого типа. То есть, возможно существование отдела с id=1 и команды с id=1.
Локализованные поля¶
Warning
Будет отменено к публичной версии API.
Некоторые поля представляют из себя объект с локализованными данными. Ключ такого объекта является сокращенным названием языка, а значение содержет локализованное представление. Например, название департамента:
{
"en": "Content-Services Maintenance Service",
"ru": "Служба эксплуатации контент-сервисов"
}
Дата и время¶
Datetime поля представлены по стандарту iso-8601 с точностью до микросекунд, и могут включать в себя смещение относительно UTC. Пример:
{
"created_at": "2016-11-02T16:33:27.482518+03:00",
}
Пример даты без времени:
{
"birthday": "1990-03-02"
}
Пейджинация по результатам¶
Пример ответа по запросу пользователей /users/:
{
"links": {
"next": "https://dir.yandex.ru/users/page=4&per_page=10",
"prev": "https://dir.yandex.ru/users/page=2&per_page=10",
"last": "https://dir.yandex.ru/users/page=10&per_page=10",
"first": "https://dir.yandex.ru/users/page=1&per_page=10"
}
"page": 3,
"per_page": 10,
"pages": 10,
"total": 100,
"result": [
{
"department": {
"id": 1087,
"name": "Служба IT инфраструктуры датацентров"
},
"email": null,
"name": {
"first": {
"en": "Gennady",
"ru": "Геннадий"
},
"last": {
"en": "Chibisov",
"ru": "Чибисов"
}
},
"gender": "male",
"groups": [],
"id": 110947743,
"nickname": "nogoodi4"
},
...
]
}
links - объект с информацией о пагинации:
page - текущая страница
per_page - какое кол-во объектов выведено на странице
pages - общее кол-во страниц
total - общее кол-во сущностей
result - список сущностей
Пейджинация осуществляется за счёт словаря links, в котором могут присутствовать ссылки на
следующую и предыдущую страницы, а так же на самую первую и самую последнюю страницы.
Эти же ссылки доступны и в HTTP заголовке Links, а некоторые http библиотеки, например
python-requests,
умеют работать с этим заголовком.
Выборка вложенных объектов¶
Warning
В публичной версии API вложенные объекты не будут раскрываться по умолчанию и надо будет явно указать, что нужно раскрыть какое-то поле.
Все вложенные объекты должны по возможности раскрываться. Например, у пользователя есть список групп. Они будут выведены раскрытым списком объектов:
{
...
"email": "web-chib@ya.ru",
"groups": [
{
"id": 30141,
"name": {
"en": "Males",
"ru": "Мужчины"
}
},
...
]
...
}
В случае, если вложенный объект сам по себе содержит вложенный объект, то его не нужно раскрывать. Например, у пользователя есть департамент. Его нужно раскрыть. Но у самого департамента есть родительский департамент. Его нужно показать как идентификатор:
{
...
"email": "web-chib@ya.ru",
"department": { // объект департамента раскрыт
"id": 181,
"name": {
"en": "Group of entertainment services development",
"ru": "Группа разработки развлекательных сервисов"
},
"parent_id": 100 // объект следующей вложенности не раскрыт
},
...
}
В случае указания идентификатора объекта название атрибута должно оканчиваться на _id. Например parent_id.
Установка вложенных объектов¶
Установка связей с одних объектов с другими должна осуществляться через указание их идентификаторов. Например так, можно при создании пользователя указать id отдела, в котором он должен состоять:
POST /users/
{
...
"email": "web-chib@ya.ru",
"department_id": 181
...
}
Атрибут, содержащий идентификатор вложенного объекта, должен заканчиваться на _id.
Если вложенный объект представляет из себя список объектов, то атрибут должен заканчиваться на _ids:
PUT /users/
{
...
"email": "web-chib@ya.ru",
"group_ids": [1,2,3]
...
}
Фильтры¶
Фильтры списка сущностей должны осуществляться указанием GET параметров. В случае фильтрации по вложенным объектам
название этих параметров должно оканчиваться на _id:
/users/?department_id=1
Некоторые ресурсы поддерживают фильтрацию сразу по нескольким значениям одного атрибута. Для этого необходимо
перечислить значения через запятую, не изменяя названия параметра. Отношение в выборке между каждым значением OR.
Ниже представлен пример выборки “вывести пользователей с департаментом 1 ИЛИ 2”:
/users/?department_id=1,2
В случае указания нескольких фильтрующих параметров отношение между ними AND.
Ниже представлен пример выборки “вывести пользователей с (департаментом 1 ИЛИ 2) И (идентификатором 2 или 3)”:
/users/?department_id=1,2&id=2,3
Сортировка¶
При запросе списка сущностей можно указать порядок сортировки с помощью GET-параметра ordering:
/departments/?ordering=name
Список полей, по которым можно сортировать данные можно узнать в описании конкретной ручки. Для обратной сортировки нужно указать название поля со знаком -, например:
/departments/?ordering=-id
Можно указать список полей для сортировки через запятую:
/departments/?ordering=name,id
Если будет указано неподдерживаемое имя поля для сортировки, API вернет ошибку с кодом 422.
Ошибки¶
В случае ошибок ручки возращают ответ с HTTP кодом >= 400. В теле ответа содержится более подробная информация об ошибках:
{
"code": "some_error_happened",
"message": "Something happened with {obj} object",
"params": {
"obj": "The User",
}
}
При этом, params может отсутствовать, если ``message`` не содержит
плейсхолдеров, типа ``{obj}``.
Возможные коды ошибок, и их расшифровки описаны в разделе `Ошибки API`_.