Экспорт

Экспорт запросов в curl, Python, Postman, OpenAPI и TypeScript.

Traffic Jam превращает перехваченные запросы в готовые к запуску артефакты: curl-команду или Python-скрипт на requests для одного вызова, коллекцию Postman или спецификацию OpenAPI 3.1 для каталога маршрутов, а также типы TypeScript/JavaScript/Go для наблюдавшихся JSON-тел. Все форматы проходят через один и тот же конвейер безопасного экспорта, который по умолчанию скрывает учётные данные.

Где находится экспорт

Точка входаЧто создаёт
API lab → строка каталога → иконка Copy curlcurl с скрытыми данными для одного перехваченного запроса
API lab → панель каталога → OpenAPI / PostmanСкачивание спецификации или коллекции по всему каталогу
Детали маршрута → Inferred schema → вкладка TypeScriptОпределения типов Request/Response
Compare view → меню Copy телаTypeScript interface / JavaScript typedef / Go struct для одного JSON-тела
Диалог replay → Copy curlcurl с учётом флажка чувствительных значений в диалоге
Минимизатор запросов → Copy minimized curlcurl, пересобранный из минимизированного эффективного запроса

Каталог и модель маршрутов — часть 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.json
  • traffic-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/DigestbearerFormat: 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:

КлассификацияУсловиеcurlPythonPostman
textHex декодируется как 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/.

Документация Traffic Jam. Собрано с помощью Hugo.