Публичное API Severcart
Добро пожаловать в документацию по публичному REST API системы управления ИТ-активами Severcart.
Назначение документации
Данная документация предназначена для разработчиков и системных администраторов, которые планируют интегрировать Severcart с внешними системами или автоматизировать работу с ИТ-активами через программный интерфейс.
REST API Severcart предоставляет возможности для:
- управления компьютерами и периферийным оборудованием;
- аутентификации и авторизации через JWT-токены;
- получения отчётной информации об ИТ-активах;
- интеграции с системами инвентаризации и мониторинга.
Архитектура API
API построено по архитектуре REST и использует стандартные HTTP-методы для выполнения операций над ресурсами.
Версионирование
API использует версионирование через URL. На данный момент доступна версия v1:
/api/v1/
При выпуске новых версий предыдущие версии поддерживаются в соответствии с политикой совместимости.
Базовый URL
Все запросы к API выполняются относительно базового URL сервера Severcart:
https://<your-server>/api/v1/
Формат данных
- Запросы: JSON (
application/json) - Ответы: JSON (
application/json)
Кодировка
Все данные передаются в кодировке UTF-8.
Доступные разделы API
| Раздел | Описание | Документация |
|---|---|---|
| Аутентификация | JWT-токены для доступа к API | JWT-аутентификация |
| Компьютеры | Управление компьютерами | API компьютеров |
Аутентификация
Все конечные точки API требуют аутентификации с использованием JWT-токенов.
Получение токена
Для получения токена отправьте POST-запрос на конечную точку аутентификации:
curl -X POST https://<your-server>/api/v1/accounts/token/ \
-H "Content-Type: application/json" \
-d '{
"username": "ваш_логин",
"password": "ваш_пароль"
}'
Использование токена
Полученный access-токен передаётся в заголовке Authorization:
curl -X GET https://<your-server>/api/v1/computers/1/ \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
Время жизни токенов
| Токен | Время жизни | Назначение |
|---|---|---|
| Access | 15 минут | Доступ к защищённым ресурсам |
| Refresh | 7 дней | Обновление access-токена |
Подробнее см. JWT-аутентификация.
HTTP-методы
API использует стандартные HTTP-методы для выполнения операций:
| Метод | Описание | Идемпотентность |
|---|---|---|
GET |
Получение ресурса или списка ресурсов | Да |
POST |
Создание нового ресурса | Нет |
PUT |
Полное обновление ресурса | Да |
PATCH |
Частичное обновление ресурса | Нет |
DELETE |
Удаление ресурса | Да |
Идемпотентность
Идемпотентные операции могут быть выполнены многократно с одинаковым результатом. Это важно для реализации механизмов повторных попыток при сбоях сети.
Коды состояния HTTP
API возвращает стандартные коды состояния HTTP:
Успешные запросы
| Код | Описание |
|---|---|
200 OK |
Запрос успешно выполнен, данные возвращены |
201 Created |
Ресурс успешно создан |
204 No Content |
Запрос успешно выполнен, тело ответа пустое |
Ошибки клиента
| Код | Описание |
|---|---|
400 Bad Request |
Неверный формат запроса или ошибка валидации |
401 Unauthorized |
Токен отсутствует, недействителен или истёк |
403 Forbidden |
Недостаточно прав для выполнения операции |
404 Not Found |
Ресурс не найден |
405 Method Not Allowed |
Метод не поддерживается для данного ресурса |
409 Conflict |
Конфликт (например, превышен лимит лицензий) |
422 Unprocessable Entity |
Ошибка семантической валидации данных |
Ошибки сервера
| Код | Описание |
|---|---|
500 Internal Server Error |
Внутренняя ошибка сервера |
502 Bad Gateway |
Ошибка шлюза |
503 Service Unavailable |
Сервис временно недоступен |
Формат запросов
Заголовки
Обязательные заголовки для большинства запросов:
Content-Type: application/json
Authorization: Bearer <access-токен>
Тело запроса
Данные передаются в формате JSON:
{
"field_name": "value",
"another_field": 123
}
Формат ответов
Успешные ответы
Структура успешного ответа зависит от конечной точки.
Пример ответа со списком ресурсов:
{
"items": [
{
"id": 1,
"name": "Компьютер 1"
},
{
"id": 2,
"name": "Компьютер 2"
}
],
"pagination": {
"page": 1,
"size": 20,
"total": 150,
"pages": 8
}
}
Пример ответа с данными ресурса:
{
"id": 1,
"dns_name": "pc-001.corp.local",
"serial_number": "SN123456",
"status": "Установленные"
}
Ответы с ошибками
Ошибки возвращаются в едином формате:
{
"error_code": "код_ошибки",
"message": "Читаемое описание ошибки",
"extra": "Дополнительная информация"
}
Ошибки валидации полей:
{
"field_name": [
"Описание ошибки первого поля",
"Описание ошибки второго поля"
],
"another_field": [
"Описание ошибки"
]
}
Пагинация
Для конечных точек, возвращающих списки ресурсов, используется пагинация.
Параметры пагинации
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
page |
integer | 1 | Номер страницы |
size |
integer | 20 | Количество записей на странице (1–100) |
Структура ответа
{
"items": [...],
"pagination": {
"page": 1,
"size": 20,
"total": 150,
"pages": 8
}
}
Пример запроса с пагинацией
curl -X POST https://<your-server>/api/v1/computers/list/ \
-H "Authorization: Bearer <токен>" \
-H "Content-Type: application/json" \
-d '{
"page": 2,
"size": 50
}'
Сортировка
Сортировка задаётся через параметр sort в теле запроса.
Направления сортировки
| Префикс | Направление |
|---|---|
| (нет) | По возрастанию |
- |
По убыванию |
Примеры
Сортировка по возрастанию:
{
"sort": "id"
}
Сортировка по убыванию:
{
"sort": "-date_added"
}
Сортировка по вложенным полям:
{
"sort": "name__manufacturer__name"
}
Фильтрация
Фильтрация задаётся через объект filter в теле запроса.
Пример фильтрации
curl -X POST https://<your-server>/api/v1/computers/list/ \
-H "Authorization: Bearer <токен>" \
-H "Content-Type: application/json" \
-d '{
"filter": {
"status": "Резерв",
"place": "Office A"
}
}'
Логика фильтрации
- Несколько фильтров комбинируются по логическому И
- Пустой объект
{}возвращает все записи - Текстовые фильтры поддерживают частичное совпадение
Обработка ошибок
Стратегии повторных попыток
При получении ошибок 5xx рекомендуется реализовать механизм повторных
попыток с экспоненциальной задержкой:
import time
import requests
def request_with_retry(url, headers, data, max_retries=3):
for attempt in range(max_retries):
response = requests.post(url, headers=headers, json=data)
if response.status_code < 500:
return response
time.sleep(2 ** attempt) # Экспоненциальная задержка
return response
Логирование ошибок
Рекомендуется логировать:
- Код состояния HTTP
- Тело ответа с ошибкой
- Временную метку
- Идентификатор запроса (если доступен)
Ограничения
Лимиты запросов
| Параметр | Значение |
|---|---|
| Максимальный размер страницы | 100 записей |
| Максимальный размер запроса | 1 МБ |
| Таймаут запроса | 30 секунд |
Лицензионные ограничения
Количество компьютеров в системе ограничено лицензией. При превышении
лимитa создание новых записей возвращает ошибку 409 Conflict.
Безопасность
Рекомендации по защите токенов
- Не сохраняйте токены в localStorage — используйте httpOnly cookies или безопасное серверное хранилище
- Используйте HTTPS — все запросы должны выполняться только по защищённому протоколу
- Регулярно обновляйте токены — используйте refresh-токен для получения новой пары
- Отозывайте токены при завершении сеанса или компрометации
Права доступа
Для работы с API требуются соответствующие права доступа. Права назначаются через группы пользователей в административной панели Severcart.
| Право | Код | Описание |
|---|---|---|
ro_ce |
2048 | Просмотр компьютеров |
ap_ce |
4096 | Создание компьютеров |
rw_ce |
8192 | Редактирование компьютеров |
er_ce |
16384 | Удаление компьютеров |
Примеры использования
Пример 1: Получение списка компьютеров
# Получение первой страницы по 20 записей
curl -X POST https://<your-server>/api/v1/computers/list/ \
-H "Authorization: Bearer <токен>" \
-H "Content-Type: application/json" \
-d '{}'
Пример 2: Создание компьютера
curl -X POST https://<your-server>/api/v1/computers/ \
-H "Authorization: Bearer <токен>" \
-H "Content-Type: application/json" \
-d '{
"serial_number": "SN-2025-001",
"inventory_number": "INV-2025-0001",
"name": 15,
"status": 2,
"place": 5,
"user": 10,
"responsible": 10
}'
Пример 3: Обновление статуса компьютера
curl -X PATCH https://<your-server>/api/v1/computers/151/ \
-H "Authorization: Bearer <токен>" \
-H "Content-Type: application/json" \
-d '{
"status": 4,
"comment": "Отправлен в ремонт"
}'
Пример 4: Удаление компьютера
curl -X DELETE https://<your-server>/api/v1/computers/151/ \
-H "Authorization: Bearer <токен>"
Пример 5: Полная интеграция на Python
import requests
BASE_URL = "https://<your-server>/api/v1"
def get_token(username, password):
response = requests.post(
f"{BASE_URL}/accounts/token/",
json={"username": username, "password": password}
)
response.raise_for_status()
return response.json()["access"]
def get_computers(token, status=None):
headers = {"Authorization": f"Bearer {token}"}
data = {"filter": {}, "size": 100}
if status:
data["filter"]["status"] = status
response = requests.post(
f"{BASE_URL}/computers/list/",
headers=headers,
json=data
)
response.raise_for_status()
return response.json()
def create_computer(token, computer_data):
headers = {"Authorization": f"Bearer {token}"}
response = requests.post(
f"{BASE_URL}/computers/",
headers=headers,
json=computer_data
)
response.raise_for_status()
return response.json()
# Использование
token = get_token("admin", "password")
computers = get_computers(token, status="Резерв")
print(f"Найдено компьютеров в резерве: {len(computers['items'])}")
Поддержка и обратная связь
По вопросам работы API обращайтесь:
- Техническая поддержка: support@example.com
- Документация: https://
/docs/
Связанные разделы
- JWT-аутентификация — получение и использование токенов
- API компьютеров — управление компьютерами
- Настройка прав доступа — права и роли
История изменений
| Версия | Дата | Изменения |
|---|---|---|
| 1.0 | 2025-02 | Первоначальная версия API |