Перейти к содержимому

Файлы .http

Каждый запрос — отдельный файл с расширением .http. Устроен он как обычный HTTP:

api/users/create.http
# Создать пользователя. Комментарии начинаются с # или //.
POST {{base}}/users
Authorization: Bearer {{token}}
Content-Type: application/json
{
"name": "Viktor",
"role": "admin"
}
> save user_id = body.id
> assert status == 201
  1. Комментарии — строки, начинающиеся с # или //, до строки запроса или между заголовками.
  2. Строка запроса — МЕТОД URL. Метод можно опустить (тогда GET); HTTP/1.1 в конце допустим и игнорируется. Пробелы внутри URL нужно кодировать.
  3. Заголовки — Имя: значение, по одному на строку, до первой пустой строки.
  4. Тело — всё после пустой строки. Пустые строки внутри тела сохраняются.
  5. Директивы — строки, начинающиеся с >, в самом конце файла: > 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.http

outry run api выполняет файлы в алфавитном порядке путей, так что числовые префиксы — простой способ задать порядок цепочки. Скрытые папки, а также node_modules, target, vendor и dist пропускаются.

Окно терминала
outry convert api/ --dry-run # напечатать результат
outry convert api/ # записать .outry рядом с каждым .http
outry convert api/ --rm # … и удалить .http
api/auth/login.http
# Login
POST {{base}}/auth/login
X-Request-Id: {{$uuid}}
{"email": "{{email}}", "password": "{{password}}", "remember": true}
> save token = body.access_token
> assert status == 200
> assert body.user.id exists
api/auth/login.outry
Login: 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 не перезаписывается. Полное соответствие — в справочнике формата.