Мок-API
Управление ответом
Заголовки X-Mock-Scenario и X-Mock-Delay, задержка метода и доля случайных ошибок песочницы.
На этой странице · 4
Ошибочные ветки в интеграции обычно не проверены: воспроизвести на боевом API просроченный токен, лимит или таймаут трудно. В песочнице ответ выбирается заголовком запроса, а задержка задаётся числом миллисекунд.
X-Mock-Scenario
Значения заголовка
Сценарий применяется к найденному методу: путь всё равно должен существовать
в каталоге, иначе ответом будет обычный 404. Неизвестное значение заголовка
трактуется как success — запрос не отклоняется.
Один и тот же сценарий у разных сервисов выглядит по-разному, потому что по-разному выглядит в бою:
curl -i -X POST localhost:8080/b24/rest/crm.deal.list.json \
-H "X-Mock-Key: $KEY" -H "X-Mock-Scenario: rate_limit"
HTTP/1.1 503 Service Unavailable
{"error":"QUERY_LIMIT_EXCEEDED","error_description":"Too many requests"}
HTTP/1.1 429 Too Many Requests
content-type: application/json
x-o3-trace-id: ac95155fa992e856
x-apistend-retry-after: 1
{"code":8,"message":"Too Many Requests","details":[]}
Заголовка с паузой у Ozon нет — рекомендуемую даёт X-APIStend-Retry-After.
HTTP/1.1 429 Too Many Requests
content-type: application/json
x-request-id: 36170ddaa809e86093bdbecb84fd2482
x-ratelimit-limit: 300
x-ratelimit-remaining: 0
x-ratelimit-reset: 20
x-ratelimit-retry: 20
{"title":"Too Many Requests","detail":"rate limit exceeded","code":"TooManyRequests","requestId":"36170ddaa809e86093bdbecb84fd2482","origin":"ag-api","status":429,"statusText":"too_many_requests","timestamp":"2026-09-09T10:15:55.763Z"}
Сценарий отработавшего запроса возвращается в заголовке X-APIStend-Scenario —
по нему в тесте видно, что сработала именно нужная ветка.
Таймаут занимает соединение на 30 секунд
X-Mock-Scenario: timeout держит соединение открытым ровно 30 секунд, затем
отвечает 504 в конверте сервиса. Это и есть смысл сценария — проверить, что
ваш клиент не ждёт вечно, — но в наборе тестов такой вызов лучше держать
отдельно от быстрых: тридцать секунд он стоит всегда.
X-Mock-Delay
Задержка ответа в миллисекундах, от 0 до 3000. Значение выше потолка
обрезается до 3000, 0 отдаёт ответ немедленно.
curl -s -o /dev/null -w "%{time_total}\n" \
localhost:8080/wb/api/v3/warehouses -H "X-Mock-Key: $KEY" -H "X-Mock-Delay: 1500"
# 1.504517
Приоритет источников задержки:
- 1
Заголовок
X-Mock-DelayЕсли он есть и разбирается как число — задержка равна ему.
- 2
Настройка песочницы
latencyMsи задержка методаБез заголовка берётся меньшее из двух. У методов каталога задержка сейчас одинаковая — 180 мс, — поэтому на песочнице с настройкой 250 мс ответ приходит примерно через 180 мс.
Доля случайных ошибок
У песочницы есть настройка errorRate — доля запросов, которым шлюз ответит
ошибкой вместо успеха (в демо-данных это 5 %, потолок настройки — 50 %).
Бросок кубика настоящий, а не выведенный из запроса: смысл настройки в том,
чтобы один и тот же вызов иногда падал. Сработавшая ошибка приходит как
сценарий server_error, и это видно в X-APIStend-Scenario.
Кубик бросается только там, где сценарий остался success: запрос
с любым другим значением X-Mock-Scenario отдаёт заказанный сценарий,
а не случайную ошибку.
Подводные камни
Из запроса читается страница, но не фильтры
Ответ зависит от метода каталога, объёма демо-данных песочницы, запрошенной страницы и сегодняшней даты. Всё остальное шлюз не читает: фильтры, поиск, диапазоны дат и признаки в теле на выдачу не влияют.
Два запроса, отличающиеся только фильтром, дают побайтово одинаковый ответ:
curl -s -X POST localhost:8080/wb/api/v3/stocks/1 -d '{"skus":["1"]}' -H "X-Mock-Key: $KEY" | md5
curl -s -X POST localhost:8080/wb/api/v3/stocks/777 -d '{"skus":["999","888"]}' -H "X-Mock-Key: $KEY" | md5
# один и тот же хеш
А вот страница читается: limit, offset, номер страницы и курсор Wildberries
(settings.cursor.nmID) двигают выдачу по каталогу, и обход заканчивается пустым
списком. Фильтрации и записи данных в шлюзе нет — для ответов, зависящих
от вашего запроса, заводите собственные моки по префиксу /custom/.
Даты живут относительно сегодня
Примеры в спецификациях датированы днём, когда их написали: заказы Wildberries — мартом 2022 года, воронка продаж — периодом с июня 2023 по март 2024. Клиент почти всегда считает витрину за последние 7, 30 или 90 дней и не нашёл бы в ней ничего.
Поэтому даты ответа сдвигаются так, чтобы самая свежая пришлась на сегодня,
а расстояния между ними сохранились: заказы, стоявшие через двое суток, так
и останутся через двое. Сроки действия — till, expiresAt, dtNextBox —
уезжают в будущее, а не схлопываются в сегодняшний день.
Следствие для определённости: ответ повторяется побайтово в пределах суток, а назавтра даты в нём уезжают на сутки вперёд. В журнале запросов тело восстанавливается на момент самого запроса, поэтому там даты остаются теми, которые получил клиент.
- Смена
dataVolumeпесочницы меняет весь набор демо-данных: идентификаторы из прошлых ответов после этого не совпадут. - Задержка выдерживается после сборки ответа, лимит частоты считается до неё:
на
X-Mock-Delay: 3000ведро расходуется в момент запроса, а не через три секунды.