Как экспортировать коллекции из 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 не будет опубликован. Обязательные поля помечены *