Битрикс имеет встроенный REST API для Битрикс24, но для сайта на «1С-Битрикс: Управление сайтом» собственного REST нет — его нужно строить. Задача возникает регулярно: мобильное приложение требует данные каталога, сторонний сервис хочет получать заказы, фронтенд на React или Vue нужно снабжать данными без перезагрузки страницы. Типичная боль: при каждом новом интеграторе приходится писать костыли на COption::GetOptionString и выводить JSON через echo json_encode(), а через месяц код превращается в «лапшу».
У нас за плечами 10+ лет опыта Битрикс-разработки и более 50 реализованных API-интеграций, обрабатывающих до 10 000 RPS. Знаем все подводные камни: от проблем с кэшированием инфоблоков до ошибок сериализации в ORM. Гарантируем стабильную работу под нагрузкой и предоставляем документацию Swagger для каждого эндпоинта. Средняя экономия времени на интеграцию с внешними сервисами составляет 40%.
Как построить REST API на D7?
Основа API — контроллеры на базе \Bitrix\Main\Engine\Controller. Каждый контроллер отвечает за один ресурс. Сравнение с самописными решениями: D7-контроллеры автоматически обрабатывают ошибки, сериализуют ответы в JSON и поддерживают префильтры. Это в 2–3 раза сокращает объём кода по сравнению с ручной обработкой через $APPLICATION->RestartBuffer().
-
Создайте модуль в
/local/modules/с структуройmy.api. Определитеinstall/index.phpс методамиInstallDB()иUnInstallDB()для создания таблиц. -
Регистрируйте контроллеры в
routes.php(начиная с ядра 20.0). Сопоставьте URL с классами, например'api/v1/products' => 'MyApi\Controllers\ProductController'. - Реализуйте action-методы. Каждый метод возвращает массив — ядро сериализует его в JSON. Добавьте префильтры для аутентификации и ограничения HTTP-методов.
- Подключите сервис-слой — вынесите логику выборки и обработки в отдельные классы
ProductService,OrderServiceи т.д. Это упрощает юнит-тестирование. - Документируйте эндпоинты через Swagger (OpenAPI 3.0). Генерируйте спецификацию из аннотаций или вручную. Разместите Swagger UI в
/local/swagger/.
/local/modules/my.api/lib/ ├── Controllers/ │ ├── ProductController.php → GET /api/v1/products │ ├── OrderController.php → GET/POST /api/v1/orders │ ├── CategoryController.php → GET /api/v1/categories │ └── AuthController.php → POST /api/v1/auth/token ├── Services/ │ ├── ProductService.php │ └── OrderService.php ├── Transformers/ │ ├── ProductTransformer.php → форматирование ответа │ └── OrderTransformer.php └── Middleware/ ├── AuthMiddleware.php └── RateLimitMiddleware.php Пример контроллера: метод listAction принимает параметры пагинации и возвращает данные с мета-информацией. Код короткий, без лишних проверок — всё встроено в D7.
namespace MyApi\Controllers; use Bitrix\Main\Engine\Controller; use Bitrix\Main\Engine\ActionFilter; use MyApi\Services\ProductService; use MyApi\Middleware\AuthMiddleware; class ProductController extends Controller { public function configureActions(): array { return [ 'list' => ['prefilters' => [new AuthMiddleware()]], 'detail' => ['prefilters' => [new AuthMiddleware()]], 'create' => ['prefilters' => [new AuthMiddleware(), new ActionFilter\HttpMethod(['POST'])]], ]; } public function listAction(int $page = 1, int $perPage = 20, string $category = ''): array { $service = new ProductService(); $result = $service->getList($page, $perPage, $category); return [ 'data' => $result['items'], 'meta' => [ 'total' => $result['total'], 'page' => $page, 'per_page' => $perPage, 'pages' => ceil($result['total'] / $perPage), ], ]; } public function detailAction(int $id): array { $service = new ProductService(); $product = $service->getById($id); if (!$product) { $this->addError(new \Bitrix\Main\Error('Товар не найден', 404)); return []; } return ['data' => $product]; } } Как обеспечить безопасность REST API?
Аутентификация — частый источник проблем. Для server-to-server используем API-ключи: простой заголовок X-Api-Key. Для пользовательских запросов (mobile app, SPA) — JWT. Библиотека firebase/php-jwt подключается через Composer. Refresh-токены сохраняем в кастомной ORM-таблице с привязкой к пользователю. Это надёжнее, чем хранить сессии в файлах.
Подробнее о JWT: JSON Web Token (Wikipedia).
Формат ответов — консистентность важна. Мы придерживаемся единого шаблона: status, data, meta для успеха, errors для ошибок. D7-контроллер формирует ответ автоматически, но мы переопределяем processAfterAction для полного контроля.
protected function processAfterAction(Action $action, $result) { $response = \Bitrix\Main\Application::getInstance()->getContext()->getResponse(); $response->addHeader('Content-Type', 'application/json; charset=utf-8'); if ($this->getErrors()) { echo json_encode([ 'status' => 'error', 'errors' => array_map(fn($e) => [ 'code' => $e->getCode(), 'message' => $e->getMessage(), ], $this->getErrors()), ], JSON_UNESCAPED_UNICODE); } else { echo json_encode([ 'status' => 'ok', 'data' => $result, ], JSON_UNESCAPED_UNICODE); } exit; } CORS — если API вызывается с другого домена, обязательно добавляем заголовки и обрабатываем OPTIONS-запросы. Иначе браузер блокирует запросы.
Rate limiting — защита от перегрузок. Используем Redis или, для малой нагрузки, b_option. Например, 1000 запросов в час на ключ.
| Метод аутентификации | Применение | Простота реализации | Безопасность |
|---|---|---|---|
| API-ключ | Server-to-server | Высокая | Средняя (ключ в заголовке) |
| JWT | User-to-server (mobile, SPA) | Средняя | Высокая (с refresh-токенами) |
| Basic Auth | Legacy-системы | Высокая | Низкая (передача пароля) |
Как протестировать API?
Пишите интеграционные тесты на PHPUnit. Для изоляции используйте SQLite вместо MySQL. Проверяйте не только успешные сценарии, но и граничные случаи: неверные параметры, отсутствующие ресурсы, превышение лимитов. Пример теста для listAction:
public function testListReturnsPaginationMeta(): void { $controller = new ProductController(); $result = $controller->listAction(1, 10); $this->assertArrayHasKey('meta', $result); $this->assertArrayHasKey('total', $result['meta']); } Что входит в работу
Мы не просто пишем код. Каждый проект включает:
- Техническое задание с прототипом эндпоинтов.
- Архитектурную схему модуля.
- Реализацию контроллеров, сервисов, трансформеров.
- Документацию OpenAPI 3.0 (Swagger).
- Настройку rate limiting и CORS.
- Инструкцию по деплою и поддержку в течение месяца.
Сроки ориентировочно
| Задача | Срок |
|---|---|
| Базовый REST API (3–5 ресурсов, API-ключ, JSON-ответы) | 1.5–2 недели |
| API с JWT-аутентификацией, правами пользователей, документацией | 3–5 недель |
| Полноценный API с версионированием, rate limiting, тестами, CI | 6–10 недель |
REST API на Битрикс строится из стандартных блоков — контроллеры, ORM, кеш. Сложность не в технологии, а в проектировании: правильные эндпоинты, консистентные форматы ответов, обработка граничных случаев. Если вам нужен надёжный REST API для вашего сайта на Битрикс, свяжитесь с нами — мы оценим ваш проект за один день. Закажите разработку REST API и получите готовую документацию Swagger в комплекте.







