Мок-API

Адресация

Два способа обратиться к моку — префикс сервиса и единый префикс /v1/, — и чем они отличаются.

На этой странице · 4

У шлюза две схемы адресации. Первая нужна, когда вы подменяете боевой адрес в готовом коде: остаётся тот же путь, тот же метод, те же заголовки. Вторая — когда сервис выбирается параметром: один базовый адрес на все API стенда.

Две схемы

СхемаВид адресаКогда удобнее
Префикс сервиса/b24/…, /oz/…, /wb/…подмена боевого адреса в существующем коде
Единый префикс/v1/{service}/…свой клиент, консоль, скрипты по всем сервисам сразу

Код сервиса в едином префиксе — bitrix24, ozon, wildberries. Оба адреса ведут в один и тот же обработчик: набор заголовков, сценарии и лимиты одинаковы.

СервисПрефиксЕдиный префиксЧто подменяет
Bitrix24/b24/v1/bitrix24<portal>.bitrix24.ru/rest/
Ozon Seller API/oz/v1/ozonapi-seller.ozon.ru
Wildberries/wb/v1/wildberriessuppliers-api.wildberries.ru

Остаток пути после префикса передаётся моку как есть — вместе с параметрами запроса, телом и заголовками.

curl -s localhost:8080/wb/api/v3/warehouses -H "Authorization: $KEY"

Базовый адрес стенда задаётся переменной APISTEND_PUBLIC_ORIGIN; в примерах документации это http://localhost:8080 из .env.example. Тот же адрес каталог подставляет в поля mockBaseUrl, exampleUrl и unifiedUrl ответа /api/catalog.

Bitrix24: ещё и корень

Портал сообщает приложению DOMAIN — голый хост без пути, — и приложение склеивает адрес само: <схема>://<DOMAIN>/rest/<метод>. Поэтому у шлюза есть третий маршрут, в корне: /rest/* обслуживается как Bitrix24.

curl -s "localhost:8080/rest/crm.deal.fields.json?auth=$KEY"

Приложению, написанному для боя, менять в этом случае нечего: достаточно, чтобы DOMAIN указывал на стенд.

Почему нет поддоменов вида b24.apistend.dev

Доменное имя — способ использования товарного знака (ГК РФ ст. 1484 п. 2 пп. 5). Имена сервисов вынесены в путь, а не в поддомен, сознательно: путь адресует демо-копию и не притворяется адресом самого сервиса.

Подводные камни

Корень префикса отдаёт родной 404 сервиса, а неизвестный сервис — нет

/b24 без пути обслуживается тем же обработчиком и отвечает конвертом сервиса:

{"error":"ERROR_METHOD_NOT_FOUND","error_description":"Method not found!"}

А вот неизвестный код сервиса в едином префиксе — ошибка самого шлюза, и конверт у неё шлюзовой, а не сервисный:

{"error":"UNKNOWN_SERVICE","error_description":"Сервис «avito» не поддерживается"}

Проверять код сервиса в своём коде надёжнее, чем ловить эту разницу в тестах.

Если пути в каталоге нет, шлюз отвечает 404 в конверте сервиса и добавляет подсказку X-APIStend-Did-You-Mean — до трёх похожих путей:

x-apistend-did-you-mean: /api/v3/warehouses, /api/v3/warehouses/{warehouseId}, /api/v1/warehouses

CORS шлюз отдаёт всегда — Access-Control-Allow-Origin: * — и честно помечает это заголовком X-APIStend-Cors: added-by-sandbox. Боевые Ozon и Wildberries запросы из браузера не разрешают: если ваш код рассчитывает на CORS, в бою он работать не будет.

Собственные эндпоинты, которых нет ни в одном из трёх API, живут по отдельному префиксу /custom/… — это не сервисный префикс, и правила этого раздела к ним не относятся.