Документация Laitap

Руководство по desktop-приложению: обзор продукта, скрипты, фаззинг JSON, мультиплексор запросов. Раздел про REST API сервиса появится, когда он станет публичным.

О приложении

Laitap — бесплатный desktop API-клиент для Windows, macOS и Linux. Отправляйте HTTP-запросы, собирайте коллекции, работайте в команде и публикуйте документацию API — в духе Postman, но со своими возможностями.

Основные возможности

  • Коллекции и папки — структура запросов, переменные на уровне коллекции и папок, наследование auth.
  • Импорт Postman — загрузка коллекций v2.x в приложение.
  • Импорт трафика — HAR, Fiddler SAZ, Charles, PCAP → коллекция с ответами. Перейти к разделу Импорт трафика →
  • Cookie jar — автосохранение cookies, менеджер, отключение jar на отдельный запрос.
  • Команды и облако — общие workspace, синхронизация коллекций, совместное редактирование с presence.
  • Публичная документация — публикация коллекции на laitap.pro/docs/… с примерами curl/JS/Python/Go. Подробнее про API Docs →
  • Глобальный поискCtrl+Shift+F по URL, заголовкам, JSON, описаниям и OCR скриншотов в примерах.
  • Scripts — автоматизация до и после запроса. Перейти к разделу Scripts →
  • Фаззинг JSON — генерация «мусорных» и граничных вариантов тела запроса для проверки устойчивости API. Перейти к разделу Фаззинг JSON →
  • Мультиплексор (ковёр) — до 10 запросов параллельно или с задержкой; ответы на одном экране плитками, красные — ошибки и 5xx. Перейти к разделу Мультиплексор →
  • Снимок запроса (.snapshot) — один файл со всем контекстом бага: URL, тело, переменные, auth, scripts, последний ответ. Перейти к разделу Снимок →

Теги и умные папки

  • Теги на запросах — вкладка Tags в редакторе запроса (#платёжка, #баг, #wip).
  • Умная папка — в контекстном меню коллекции или папки: «Умная папка». Режим по тегам (любой / все) или по правилам: код ответа, запуск за N дней, метод, URL, имя.
  • Правила по ответу работают после Send — сохраняются lastStatusCode и lastRunAt на запросе.

Zero Knowledge шифрование

Для каждого workspace (личного или командного) можно включить отдельное шифрование коллекций. Это режим Zero Knowledge: сервер хранит только зашифрованные данные и не может прочитать содержимое без вашего пароля.

  • Пароль vault создаётся и проверяется только на устройстве.
  • У каждого workspace свой пароль — личный и командные не связаны.
  • В команде шифрование включают владелец и администраторы; участники разблокируют хранилище локально.
  • «Заблокировать» убирает ключ из памяти для выбранного workspace и скрывает его коллекции до повторного ввода пароля.
Включить: Настройки → Приложение → Шифрование по workspace. Потеря пароля означает потерю доступа к зашифрованным данным — восстановить содержимое на сервере нельзя.

Где начать

Скачать приложение Веб-демо Changelog

Scripts

Скрипты позволяют менять запрос перед отправкой и проверять ответ после. API похож на Postman pm: переменные коллекции, URL, метод, заголовки.

Где писать скрипты

  • Pre-request Script — на коллекции, папке или отдельном запросе (вкладка Scripts в редакторе запроса или в настройках сущности коллекции).
  • Post-response Script (Tests) — только JavaScript, на запросе, папке или коллекции.

Порядок выполнения

Pre-request (перед отправкой HTTP):

  1. Скрипт коллекции
  2. Скрипты папок сверху вниз по пути к запросу
  3. Скрипт запроса

Post-response (после ответа): в обратном порядке — сначала запрос, затем папки снизу вверх, затем коллекция.

Языки Pre-request

Язык Среда Когда выбрать
JavaScript Встроенный sandbox По умолчанию; совместимость с Postman, crypto-js, uuid
Python Pyodide (WASM) в renderer Удобные строки и логика без Node.js; объект pm как в Postman
Go Нативный runner Строгая типизация, команды на Go; API через pm.Pm
Язык выбирается отдельно для каждой сущности (коллекция / папка / запрос) в выпадающем списке на вкладке Scripts. Post-response всегда JavaScript.

Объект pm — что доступно

  • pm.collectionVariables / pm.variables — get, set, has, unset
  • pm.request.url, pm.request.method
  • pm.request.headers — add, upsert, remove, get
  • Post-response: pm.response, pm.test(), pm.expect()

Переменные {{name}} в URL и теле подставляются после pre-request скриптов, с учётом изменений из скрипта.

Примеры Pre-request


                

Пример Post-response (только JS)

pm.test('Status is 200', function () {
  pm.response.to.have.status(200);
});

const json = pm.response.json();
pm.collectionVariables.set('lastId', json.id);

Советы

  • Используйте реальные URL в тестах, например https://httpbin.org/get — домены вроде api.example.com часто не резолвятся в DNS.
  • Пустой скрипт не меняет запрос — можно оставить язык Python/Go и дописать код позже.
  • Ошибки скрипта показываются до отправки HTTP; при успехе запрос уходит с обновлённым URL, заголовками и переменными.

Публикация API-документации

Фаззинг JSON

Фаззинг JSON — встроенный генератор вариантов тела запроса для ручного тестирования API. Вы задаёте «эталонный» JSON, приложение по правилам меняет отдельные поля на граничные и «плохие» значения. Без нейросетей: только комбинаторика и заранее заданные мутации.

Кому полезно: QA и разработчикам, которые проверяют, как API реагирует на пустые строки, огромные числа, null, бинарный мусор в тексте, пустые массивы и прочий невалидный с точки зрения бизнес-логики ввод.

Где находится в приложении

  1. Откройте запрос в коллекции или создайте новый.
  2. Перейдите на вкладку Body.
  3. Для REST: режим raw и тип JSON — панель «Фаззинг JSON» появится над редактором тела.
  4. Для GraphQL: панель находится над полем Variables (переменные тоже должны быть валидным JSON).

Как работать: пошагово

  1. Вставьте или напишите валидный JSON — тот, который обычно отправляете на сервер (happy path).
  2. Укажите количество вариантов (по умолчанию 10, максимум 50).
  3. Нажмите «Сгенерировать N вариантов». Список появится под панелью: для каждого варианта видны путь к полю ($.user.age), описание мутации и превью JSON.
  4. Нажмите «Применить» у нужного варианта — тело запроса заменится на сгенерированное.
  5. Нажмите Send и зафиксируйте код ответа, тело, время, ошибки валидации.
  6. Повторите для других вариантов из списка (или сгенерируйте список заново после правки эталонного JSON).

Типичный сценарий тестировщика: один запрос в коллекции → 10 вариантов → 10 отправок с записью результатов в таблицу или в post-response скрипт.

Как устроена генерация

  • Приложение разбирает JSON как дерево и находит все изменяемые узлы: числа, строки, массивы, объекты, null, булевы значения — включая вложенные поля и элементы массивов.
  • Для каждого узла применяется фиксированный набор правил по типу (см. таблицу ниже).
  • Каждый вариант — это копия исходного JSON с изменением одного узла. Остальные поля остаются как в эталоне.
  • Из всех возможных мутаций выбирается до N вариантов с приоритетом разнообразия по полям: сначала по одному варианту на разные пути ($.name, $.count, …), чтобы не получить десять мутаций одного и того же ключа.
  • Дубликаты с одинаковым телом отбрасываются.
Фаззинг не подставляет случайные байты и не ломает синтаксис JSON — вы всегда отправляете синтаксически корректный JSON с «плохими» значениями внутри. Для проверки битого JSON используйте ручное редактирование тела.

Правила мутаций по типам

Тип поля Что генерируется (примеры) Зачем тестировать
Число
100
-100, 0, 999999, 1.5, null, -1, 9007199254740991 (MAX_SAFE_INTEGER) Отрицательные, ноль, переполнение, дроби, смена типа на null
Строка
"hello"
"", строка из 10 000 символов "a", "\u0000\u0001", кириллица и умлауты, null, только пробелы и переводы строк Пустой ввод, длина, бинарный мусор, Unicode, null вместо строки
Массив
[1, 2]
[], null, только первый элемент [1], дубликат последнего, добавление 999, укороченный/расширенный набор элементов Пустой список, один элемент, лишние элементы, null вместо массива
Объект {}, null, исходный объект + поле __fuzz Пустое тело, неожиданные поля, смена типа
Boolean Инверсия (truefalse), null Неверный флаг, null вместо bool
null 0, "", false, [], {} Сервер ожидал null, а пришёл другой тип

Пример 1: простой POST

Эталонное тело:

{
  "name": "hello",
  "count": 100,
  "tags": [1, 2],
  "active": true
}

После генерации 10 вариантов вы можете увидеть, среди прочего:

  • $.count100 → 0 или 100 → 999999
  • $.name"hello" → "" или длинная строка из a
  • $.tags[2 items] → [] или → null
  • $.activetrue → false

Применяете вариант → Send → проверяете: сервер вернул 400 с понятной ошибкой или упал с 500 (баг).

Пример 2: вложенный объект

{
  "user": {
    "email": "test@example.com",
    "age": 25
  },
  "items": [
    { "sku": "A1", "qty": 2 }
  ]
}

Генератор находит пути вроде $.user.email, $.user.age, $.items[0].sku, $.items[0].qty, а также сам массив $.items и объект $.user. Мутации распределяются по разным путям, чтобы за один прогон покрыть несколько полей.

Пример 3: GraphQL variables

На вкладке Body в режиме GraphQL эталон variables:

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "limit": 10
}

Фаззинг меняет, например, $.id на пустую строку или строку с нулевыми байтами, а $.limit — на 0 или 999999. После «Применить» отправьте запрос с тем же query — меняются только variables.

Чек-лист для тестировщика

  • Сервер возвращает 4xx с внятным сообщением, а не 500?
  • Валидация срабатывает на пустых строках и null?
  • Большие числа и длинные строки не кладут сервис (таймаут, OOM)?
  • Пустой массив / один элемент — ожидаемое поведение по спецификации?
  • Лишнее поле __fuzz игнорируется или отклоняется?
  • Кириллица и спецсимволы в строках обрабатываются корректно (кодировка)?

Ограничения

  • Нужен синтаксически валидный JSON до генерации (комментарии в стиле Postman поддерживаются при разборе).
  • Не более 50 вариантов за один клик.
  • Один вариант меняет одно поле/узел за раз (не полный combinatorial explosion всех полей сразу).
  • Режимы body form-data, x-www-form-urlencoded и binary не поддерживаются — только raw JSON и GraphQL variables.
  • Автоматическая отправка всех вариантов подряд пока не реализована: каждый вариант применяется и отправляется вручную (или через свой скрипт).

Связь с другими возможностями

  • Post-response Script — можно писать pm.test на код ответа после каждого фазз-варианта. Раздел Scripts →
  • Симуляция сети (вкладка Network) — комбинируйте с фаззингом, чтобы проверять retry при плохом теле и обрыве соединения.
  • Примеры (Examples) — сохраняйте удачные/падающие варианты как examples в коллекции для регрессии.

Скачать Laitap Веб-демо

Мультиплексор запросов (ковёр)

Мультиплексор запускает набор из 5–10 запросов одновременно (или с паузой между стартами) и показывает все ответы на одном экране в виде плиток — «ковёр». Удобно после деплоя: проверить health-check, auth, основные CRUD-эндпоинты за один клик.

Отличие от Postman Runner: в Postman параллельный прогон коллекции доступен только в платных планах; здесь параллельный запуск встроен и бесплатен.

Как открыть

  1. В боковой панели коллекций откройте контекстное меню (ПКМ) на коллекции или папке.
  2. Выберите «Мультиплексор (ковёр)».
  3. В модальном окне появятся запросы из выбранной области (до 10 штук).

Настройка и запуск

  1. Снимите галочки с запросов, которые не нужны в этом прогоне.
  2. У каждого включённого запроса поле × N — сколько раз отправить его за прогон (до 20). Например, × 8 на одном POST — восемь одинаковых запросов параллельно, чтобы проверить гонки и идемпотентность на бэкенде.
  3. Счётчик «Запусков» — сумма всех × N (максимум 50 HTTP за один ковёр).
  4. Выберите режим: Параллельно — все стартуют сразу; С задержкой — между стартами пауза (мс), удобно для rate-limit.
  5. Нажмите «Запустить ковёр». Во время выполнения доступна кнопка «Остановить».

Чтение плиток

  • Зелёная — HTTP 2xx.
  • Жёлтая — редиректы и 4xx (запрос дошёл, но ответ «не OK»).
  • Красная — сеть/DNS/TLS, отмена, 5xx и прочие сбои.
  • На плитке: метод, имя запроса, код ответа, время, превью тела.
  • При повторе одного запроса на плитке виден номер #1, #2

Что учитывается при отправке

  • Переменные коллекции и папок, auth, Pre-request Script на запросе и предках.
  • Настройки запроса (таймаут, редиректы, SSL) и вкладка Network (симуляция сети).
  • Каждый запрос идёт с отдельным clientRequestId — параллельные запросы не блокируют друг друга.

Типичные сценарии

  • Smoke-тест после деплоя: 8 health/auth/API эндпоинтов параллельно.
  • Проверка папки «Payments» с задержкой 200 мс между стартами.
  • Быстрый обзор: какие из сохранённых запросов сейчас отвечают 200.
  • Нагрузочный мини-тест: один эндпоинт × 10 параллельно — как сервер отвечает на дубли.

Скачать Laitap Веб-демо

Снимок запроса (.snapshot)

Снимок — полный слепок состояния запроса в одном файле .snapshot. Нашли баг → сохранили снимок → отправили разработчику → он открыл и видит ту же среду, что была у вас.

Отличие от Postman: там экспорт коллекции, окружения и переменных — отдельно. В Laitap всё в одном файле, включая последний ответ и отличия от сохранённой версии в коллекции.

Где в приложении

В строке URL запроса кнопка Snapshot (рядом с Examples и Send). Основной клик — сохранить; меню ▾ — «Сохранить» или «Открыть снимок…».

Что попадает в файл

  • Метод, URL, params, headers, body, auth, scripts, settings, Network simulation
  • Переменные коллекции и папок (resolved + сырые строки)
  • Наследованный auth с коллекции/папки
  • Последний полученный ответ (если был Send)
  • changeLog — отличия черновика от версии в коллекции (если запрос привязан)

Открытие снимка

  1. Snapshot ▾ → «Открыть снимок…»
  2. Запрос откроется в новой вкладке; переменные из снимка подставятся в подсветку {{var}}
  3. Если в снимке был ответ — он появится в панели Response

Скачать Laitap

Импорт трафика (HAR, Fiddler, Charles, Wireshark)

Запишите реальный трафик на Production через браузер, Fiddler, Charles или Wireshark — импортируйте лог в Laitap и получите коллекцию: каждый HTTP-запрос с сохранённым ответом (как Postman Example). Можно сразу повторять локально.

Горячая клавиша: Ctrl+Shift+O или кнопка с иконкой сигнала в боковой панели коллекций.

Поддерживаемые форматы

  • .har — Chrome DevTools, Firefox, Charles (Export HAR), Fiddler Everywhere
  • .saz — Fiddler Classic (File → Save → All Sessions)
  • .chls / .chlsj — Charles Session (или экспорт HAR из Charles)
  • .pcap — Wireshark, только HTTP без TLS (HTTPS нужен HAR из прокси)

Как импортировать

  1. File → Import Traffic Log… или кнопка в сайдбаре.
  2. Выберите файл лога.
  3. Коллекция создаётся с папками по хостам; у каждого запроса — example с телом ответа.
  4. До 500 запросов за импорт; CONNECT и служебный трафик пропускаются.

Ограничения

  • Зашифрованный HTTPS из PCAP без ключей не восстанавливается — используйте HAR из прокси.
  • pcapng: экспортируйте HTTP как HAR или сохраните classic pcap.

Скачать Laitap