Файлы .http
Каждый запрос — отдельный файл с расширением .http. Устроен он как обычный HTTP:
# Создать пользователя. Комментарии начинаются с # или //.POST {{base}}/usersAuthorization: Bearer {{token}}Content-Type: application/json
{ "name": "Viktor", "role": "admin"}
> save user_id = body.id> assert status == 201- Комментарии — строки, начинающиеся с
#или//, до строки запроса или между заголовками. - Строка запроса —
МЕТОД URL. Метод можно опустить (тогдаGET);HTTP/1.1в конце допустим и игнорируется. Пробелы внутри URL нужно кодировать. - Заголовки —
Имя: значение, по одному на строку, до первой пустой строки. - Тело — всё после пустой строки. Пустые строки внутри тела сохраняются.
- Директивы — строки, начинающиеся с
>, в самом конце файла:> saveи> assert. Подробнее — Цепочки запросов и проверки.
Подстановки {{name}} работают в URL, в именах и значениях заголовков и в теле — см.
Переменные и окружения.
- Если тело начинается с
{или[и заголовкаContent-Typeнет, Outry добавитContent-Type: application/json. - После подстановки URL должен быть абсолютным (
http://илиhttps://). Относительный URL почти всегда значит, что забыт{{base}}. - Окончания строк Windows (CRLF) поддерживаются.
- У каждого запроса таймаут 30 секунд (меняется через
outry run --timeout) и заголовокUser-Agent: outry/<версия>, если вы не задали свой.
Как раскладывать файлы
Заголовок раздела «Как раскладывать файлы»Папки — это просто папки. Обычно запросы группируют по ресурсам:
api/├── env.toml├── auth/│ ├── 1-login.http│ └── 2-refresh.http└── users/ ├── create.http ├── get.http └── list.httpoutry run api выполняет файлы в алфавитном порядке путей, так что числовые префиксы — простой способ
задать порядок цепочки. Скрытые папки, а также node_modules, target, vendor и dist пропускаются.
Перевод в .outry
Заголовок раздела «Перевод в .outry»outry convert api/ --dry-run # напечатать результатoutry convert api/ # записать .outry рядом с каждым .httpoutry convert api/ --rm # … и удалить .http# LoginPOST {{base}}/auth/loginX-Request-Id: {{$uuid}}
{"email": "{{email}}", "password": "{{password}}", "remember": true}
> save token = body.access_token> assert status == 200> assert body.user.id existsLogin: POST /auth/login { headers { X-Request-Id: uuid() } body { email, password, remember: true }
expect { status == 200 body.user.id != null }
save token = body.access_token}- Первая строка комментария становится именем запроса (
Login: POST …), если она короткая (до четырёх слов); иначе имя строится из имени файла, а комментарий уходит в описание. {{base}}/…становится путём,{{x}}в нём — параметром{x}; остальные URL остаются как есть.- JSON-тело остаётся JSON:
"{{x}}"становится переменнойx,{{x}}без кавычек —number(x). Остальные тела становятся строками. > assertпревращается вexpect;exists— в!= null,contains— в.contains()..outryсравнивает без приведения типов, поэтому заголовок, который сравнивали с числом, оборачивается вnumber().{{$uuid}},{{$timestamp}}и{{$randomInt 1 10}}становятсяuuid(),now()иrandomInt(1, 9)— в.outryверхняя граница включается.
Существующий .outry не перезаписывается. Полное соответствие — в
справочнике формата.