Экспорт
Экспорт запросов в curl, Python, Postman, OpenAPI и TypeScript.
Traffic Jam превращает перехваченные запросы в готовые к запуску артефакты: curl-команду или Python-скрипт на requests для одного вызова, коллекцию Postman или спецификацию OpenAPI 3.1 для каталога маршрутов, а также типы TypeScript/JavaScript/Go для наблюдавшихся JSON-тел. Все форматы проходят через один и тот же конвейер безопасного экспорта, который по умолчанию скрывает учётные данные.
Где находится экспорт
| Точка входа | Что создаёт |
|---|---|
| API lab → строка каталога → иконка Copy curl | curl с скрытыми данными для одного перехваченного запроса |
| API lab → панель каталога → OpenAPI / Postman | Скачивание спецификации или коллекции по всему каталогу |
| Детали маршрута → Inferred schema → вкладка TypeScript | Определения типов Request/Response |
| Compare view → меню Copy тела | TypeScript interface / JavaScript typedef / Go struct для одного JSON-тела |
| Диалог replay → Copy curl | curl с учётом флажка чувствительных значений в диалоге |
| Минимизатор запросов → Copy minimized curl | curl, пересобранный из минимизированного эффективного запроса |
Каталог и модель маршрутов — часть API lab, см. /docs/ru/api-re/.
Копирование одного запроса в curl или Python
Кнопка копирования для отдельного запроса в каталоге всегда создаёт команду со скрытыми данными (includeSensitiveValues: false). Сгенерированный curl сохраняет метод (враждебные строки метода экранируются для shell), добавляет --compressed и сохраняет тела даже GET-запросов через --data-raw:
curl 'https://example.test/users?page=2' -X 'POST' \
-H 'Content-Type: application/json' \
-H 'X-Request-ID: request-123' \
--data-raw '{"username":"alice"}' --compressed
Тот же конвейер генерирует Python-скрипт на requests (requests.request(METHOD, url, headers=headers, data=payload), с выводом статуса и тела). Экспортёр Postman указывает на экспорт в cURL или Python, когда бинарное тело не может быть представлено в Postman.
Hop-by-hop и управляемые заголовки удаляются из всех командных экспортов: accept-encoding, connection, keep-alive, proxy-authenticate, proxy-authorization, te, trailer, transfer-encoding, upgrade, content-length, host, псевдозаголовки HTTP/2 (:method, :authority, …), заголовки с именами учётных данных, такие как Authorization и Cookie, а также Content-Encoding, если перехваченное тело уже было декодировано.
Экспорт всего каталога: Postman и OpenAPI
На панели каталога в API lab выберите область — Current view · N routes (отфильтрованный каталог, по умолчанию) или All captured · N routes — затем нажмите OpenAPI или Postman. Диалог подтверждения показывает количество маршрутов и вызовов; для Postman он также предлагает флажок Include captured credentials (по умолчанию выключен, сбрасывается после каждого экспорта). Подтверждение запускает скачивание:
traffic-jam-postman-current-view.json/traffic-jam-postman-all-captured.jsontraffic-jam-openapi-current-view.json/traffic-jam-openapi-all-captured.json
Вывод Postman — документ коллекции v2.1.0 с одной папкой на хост. Смоделированные шаблоны путей становятся переменными пути Postman (/users/{id} → /users/:id) с предзаполненным значением replace-me, чтобы перед отправкой пришлось указать безопасное значение. Каждый запрос несёт до трёх перехваченных примеров ответов, сырое тело с определением языка (json, xml, graphql или text) и описание с количеством перехватов и правилами модели маршрутов, которые его породили.
Вывод OpenAPI — спецификация OpenAPI 3.1.0. Маршруты группируются по методу и форме пути; параметры пути получают выведенные схемы (integer для полностью числовых значений, string с format: uuid для UUID); параметры query и header перечисляются по имени, а перехваченные значения опускаются. Наблюдавшаяся аутентификация становится components.securitySchemes: схемы http для Bearer/Basic/Digest (с bearerFormat: JWT для трёхсегментных токенов) и определения apiKey для чувствительных заголовков, cookie (имена вида session, token, jwt) и query-параметров; маршруты, встреченные как с учётными данными, так и без них, получают пустое альтернативное требование. Тела получают выведенную схему для каждого типа носителя с максимум тремя примерами со скрытыми данными, каждый из которых фиксирует происхождение декодирования в x-traffic-jam-decode. Методы вне набора глаголов OpenAPI вместо удаления перечисляются в x-traffic-jam-unsupported-operations.
[!NOTE] Экспорт OpenAPI всегда полностью скрывает данные — в нём нет опционального включения чувствительных значений. Перехваченные фразы причины (reason phrase) ответов никогда не экспортируются, а строки, похожие на учётные данные, в хостах, именах заголовков, типах носителя и именах параметров пути нейтрализуются (хост, похожий на учётные данные, становится
redacted.invalid).
TypeScript и другая генерация типов
Раздел Inferred schema панели деталей маршрута содержит вкладки Request, Response и TypeScript. Вкладка TypeScript выдаёт псевдонимы типов, названные по маршруту, например export type PostExampleTestUsersRequest = { … } и соответствующий …Response, построенные из выведенных JSON-схем; кнопка Copy помещает их в буфер обмена, а вкладки схем предлагают скачивание JSON Schema (<route-id>-<request|response>-schema.json).
В Compare view меню Copy тела генерирует типы из одного JSON-тела: TypeScript export interface, JSDoc @typedef или Go struct с тегами json:"…,omitempty" на опциональных полях.
Модель безопасности экспорта
Перехваты из авторизованного тестирования содержат живые учётные данные, поэтому артефакты по умолчанию пригодны для распространения, а точные значения требуют явного включения (флажок Include captured credentials или переключатель чувствительных значений в диалоге replay, описанный в /docs/ru/replay/). Маскирование в представлениях анализа описано в /docs/ru/security/.
| Перехваченные данные | Экспорт по умолчанию | При явном включении |
|---|---|---|
Заголовки с учётными данными (Authorization, Cookie, …) | Полностью удаляются | Включаются дословно |
| Прочие чувствительные значения заголовков | Значение заменяется маркером скрытия | Включаются дословно |
| Чувствительные значения query/fragment | Заменяются на <redacted> | Включаются дословно |
Сегменты пути под родителями auth/tokens/oauth/passwords/sessions/… или похожие на известные токены (AKIA…, eyJ… JWT, gh[pous]_…, github_pat_…, sk/pk-live/test, xox[baprs]-…, 32+ смешанных буквенно-цифровых) | Маркер скрытия (UUID и числовые ID сохраняются) | Включаются дословно |
| JSON/поля форм, выглядящие как секреты, даже под нейтральными ключами или в качестве имён свойств | Скрываются | Включаются дословно |
| Непрозрачные (бинарные или с потерями) тела | Заменяются заглушкой / опускаются | Точные hex-байты |
Варианты экспорта тела
prepareExportBody классифицирует каждое перехваченное тело как text, hex или opaque:
| Классификация | Условие | curl | Python | Postman |
|---|---|---|---|---|
text | Hex декодируется как UTF-8 точно в сохранённый предпросмотр | --data-raw (со скрытием) | строка data=payload | Сырое тело |
hex | Бинарное тело, включение разрешено | printf %s '<hex>' | xxd -r -p | curl … --data-binary @- | bytes.fromhex("<hex>") | Всё ещё помечено как незапускаемое; точные байты сохраняются в x-traffic-jam-exact-body-hex |
opaque | Бинарное тело без включения или усечённый перехват | Комментарий # NOT RUNNABLE: … | raise RuntimeError("NOT RUNNABLE: …") | Префикс имени ⚠, тело опускается, предупреждение в описании |
Манифест безопасности
Экспорты Postman и OpenAPI встраивают манифест x-traffic-jam-export (версия 2), чтобы рецензенты ниже по потоку могли видеть, что произошло:
{
"version": 2,
"policy": {
"capturedSensitiveValues": "redacted",
"opaqueBodies": "omitted",
"pathCredentials": "redacted"
},
"report": {
"routes": 42, "calls": 318,
"urlRedactions": 7, "headerRedactions": 84,
"bodyRedactions": 12, "opaqueBodies": 3, "truncatedBodies": 1,
"warnings": ["3 opaque bodies are omitted from examples because it cannot be inspected safely."]
}
}
При включённом флажке поля политики принимают значение included-by-explicit-opt-in. Держите флажок выключенным для всего, что покидает вашу машину; автономный Go-коллектор — отдельный рабочий процесс, см. /docs/ru/collector/.