Битрикс має вбудований REST API для Бітрікс24, але для сайту на «1С-Бітрікс: Управління сайтом» власного REST немає — його потрібно будувати. Задача виникає регулярно: мобільний додаток потребує дані каталогу, сторонній сервіс хоче отримувати замовлення, фронтенд на React або Vue потрібно забезпечувати даними без перезавантаження сторінки. Типовий біль: при кожному новому інтеграторі доводиться писати костилі на COption::GetOptionString та виводити JSON через echo json_encode(), а через місяць код перетворюється на «локшину».
У нас за плечима 10+ років досвіду Bitrix-розробки та більше 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 у комплекті.







