Как экспортировать коллекции из Postman и сконвертировать в http/curl/wget

Этот пост был опубликован мной более года назад. Информация, описанная ниже, уже могла потерять актуальность, но всё ещё может быть полезна.

Привет. Перед прочтением этой статьи настоятельно рекомендую надеть резиновые перчатки, респиратор и что-нибудь на глаза, чтобы не забрызгало.

Мы будем трогать постман.

Пользователь Postman каждый день

И здесь не будет скриншотов для кретинов о том, как нажимать кнопочки в его паршивой гуйне, чтобы экспортировать за раз целую 1 коллекцию или 1 запрос в curl. Мы же не животные.

Пост пропитан лютой ненавистью к этому ржавому глюкавому дерьмодемону.

Ура! Наконец и ты тоже решил избавиться от этого проклятого WYSIWYG-а. Конец херовой синхронизации, конец драконовским ограничениям. Хочется чего-то простого и рабочего. Необходимо исправлять ошибки своей молодости.

Ты был несведущ, пацаны говорили, что постман избавит тебя от проблем, сделает счастливым… но ты плотненько подсел на это дерьмо и постоянно пытаешься найти тот одноразовый кайф, который когда-то испытал. В какой-то момент твой братан сдох и вот тебе уже приходится башлять двум индусам-барыгам несметные деньги, чтобы продолжать страдать.

А за это время вся твоя учётка (или даже целая команда некогда классных чюваков и чювесс, которым уже ты сам сломал жизни) обросла коллекциями и переменными.

Что делать?

Давай я помогу тебе, коллега.

Для начала — удали постман. Прямо сейчас и весь.

Да, я серьёзно, не ссы. Вырезай его к херам, с корнями. Он не нужен. Он никогда не был нужен.

Postman — зло. Его не должно существовать.

Люди ошибаются, но люди также в силах бороться с собой. С постманом. Удаляй.

Массовый экспорт

Вариант простой

Подойдёт для тех, кто владеет своим аккаунтом и он зарегистрирован на личную почту, к которой есть доступ.

  1. Входим в учётку:
    https://identity.getpostman.com/login
  2. ЛКМ по своей аватарке -> Settings -> Export data -> Export data -> Request data export
  3. Ждём архив на свою почту.

Вариант посложнее

Подойдёт тем, кто не имеет доступа к почте, на которую заведена учётка, либо участникам команды, которые работают в одном Workspace и имеют доступ к настройкам. Тут придётся, конечно, изловчиться, но другого выхода нет.

Для начала мы сходим в настройки учётки и создадим себе токен для доступа к Postman API:

  1. Входим в учётку:
    https://identity.getpostman.com/login
  2. ЛКМ по своей аватарке -> Settings -> API keys -> Generate API Key
  3. Вводим название, подтверждаем и копируем выданный токен куда-нибудь под руку.

Там же, в браузере, возвращаемся в раздел Collections и встаём на любую. В адресной строке, точнее, в самом её конце (после /collection/), ты увидишь UUID этой коллекции.

Теперь переходи в Environments и вставай на любую из существующих сред. В адресе тоже есть UUID, сразу после /environment/.

Открываем текстовый редактор и сохраняем вот это в .sh-файл:

#!/bin/bash

api_key="PMAK-***"

declare -A collection_uuids=(
#   [название]="UUID"
#   ...
)

declare -A environment_uuids=(
#   [название]="UUID"
#   ...
)

collections_folder="postman/collections"
environments_folder="postman/environments"

##################################################################################################
##################################################################################################
##################################################################################################

log() {
    [ ! -d "$log_path" ] && mkdir -p "$log_path"
    echo -e "[$(date '+%H:%M:%S')] $*" | tee -a "$log_path/export-$(date '+%Y%m%d').log"
}

log_path="postman/logs"
log "============================================================================"
log "Export started"

if [ "$1" == '-r' ]; then
    log "Removing folders (-r provided):\n\t$collections_folder\n\t$environments_folder"
    rm -rf "$collections_folder" "$environments_folder"
fi
mkdir -p "$collections_folder" "$environments_folder" "$log_path"

count=${#collection_uuids[@]}
if [ $count == 0 ]; then
    log "No collections to export, skipping"
else
    cur=1
    for name in "${!collection_uuids[@]}"; do
        filename="$collections_folder/$name.postman_collection.json"
        collection_uuid="${collection_uuids[$name]}"
        log "Collection $cur/$count: $name"
        log "\tFile\t: $filename"
        curl -X GET https://api.getpostman.com/collections/$collection_uuid \
            --silent \
            --header "Cache-Control: no-cache" \
            --header "X-Api-Key: $api_key" \
            --output "$filename" 2>&1
        [ $? ] && result="OK" || result="ERROR $?"
        log "\tResult\t: $result"
        ((++cur))
    done
fi

log "Exporting environments"

count=${#environment_uuids[@]}
if [ $count == 0 ]; then
    log "No environments to export, skipping"
else
    cur=1
    for name in "${!environment_uuids[@]}"; do
        filename="$environments_folder/$name.postman_environment.json"
        environment_uuid="${environment_uuids[$name]}"
        log "Environment $cur/$count: $name"
        log "\tFile\t: $filename"
        curl -X GET https://api.getpostman.com/environments/$environment_uuid \
            --silent \
            --header "Cache-Control: no-cache" \
            --header "X-Api-Key: $api_key" \
            --output "$filename" 2>&1
        [ $? ] && result="OK" || result="ERROR $?"
        log "\tResult\t: $result"
        ((++cur))
    done
fi
log "Export finished!"

В переменные collection_uuids и environment_uuids этого скрипта тебе надо загнать значения в формате [название]="UUID", для коллекций и для сред соответственно. Где их брать я упомянул выше.

Забивай уиды, сохраняй в файл и chmodь его на +x. Запускай и получишь на выходе все свои коллекции и среды в виде json-файлов в своих папочках.

Если данных много (куча запросов с тестами, переменными, примерами и описаниями), то экспорт может длиться вплоть до нескольких минут. Это нормально.

Забудь о постмане и живи счастливо. Полдела сделано.

Конвертация

Теперь мы будем всё конвертировать. Для этого я написал вот такую штукенцию:

Ставим:

composer global r axenov/pm-convert

Запускаем:

./pm-convert \ 
    -d ~/postman/collections \ 
    -e ~/postman/localhost.postman_environment.json \ 
    -o ~/postman/exported
    --http \
    --curl \
    --wget

И через секунду радуемся!

Теперь у нас есть пачка файлов запросов, где вместо {{переменных}} указаны реальные (существующие) значения и все заголовки на месте.

С ними можно делать что угодно! Даже IDEA умеет работать с http-файлами.

Обращу внимание, что сейчас поддерживается только Bearer-авторизация и вон те три формата для конвертации. В остальных форматах я пока не вижу особого смысла, а вот с авторизашками ещё поработаю.

Также я добавлю генерацию md-файлов документации с включёнными примерами. Такая наработка у меня уже есть, но я ещё не перетаскивал её в pm-convert.

Жду твои предложения и баг-репорты:

https://git.axenov.dev/anthony/pm-convert

Следи за обновлениями, там ещё будут плюшечки.

Здравия тебе.

Update 18.09.23

Теперь можно конвертировать коллекции из v2.0 в v2.1 и обратно. Исправлена куча ошибок и логики, так что рекомендую использовать pm-convert с версии 1.5.0 и выше. Ну и вообще, почаще запускать composer global update.

FAQ

Почему именно php, а не раст или го?

Захотел. Так я просто, быстро и удобно решил задачу без лишних 🚀🚀🚀🚀 выебонов. Оказывается, так тоже можно.

Ко-ко-ко, это мне чё теперь, пыху ставить себе на комп?

Да. А что с ебалом? Ещё скажи что ты не ставил себе через ноду консольные js-утилиты, которые кто-то тоже мог бы написать в твоей любимой экосистеме, но не написал, потому что он тупой говнарь. Вот и пыху поставишь. Я тоже тупой говнарь 🙂

Ну, или в докер заверни, если такой брезгливый.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *