Консольный HTTP-клиент с красивым форматированием JSON, поддержкой IPv4/IPv6/IPv8 и множеством фич из curl.
# Сборка
go build -o iurl ./cmd/iurl
# Или через make
make build# Простой GET-запрос
iurl https://api.example.com
# POST с JSON
iurl -X POST -d '{"name":"John"}' https://api.example.com/users
# POST через --json (автоматически ставит Content-Type)
iurl --json '{"name":"John"}' https://api.example.com/users
# Только заголовки (HEAD)
iurl -I https://api.example.com# Form-urlencoded (автоматически ставит Content-Type)
iurl -d "name=John&age=30" https://api.example.com
# JSON (автоматически ставит Content-Type)
iurl --json '{"name":"John"}' https://api.example.com
# JSON из файла
iurl --json @data.json https://api.example.com
# Данные из stdin
echo "data" | iurl -d @- https://api.example.com
# Загрузка файла через PUT
iurl -T file.txt https://api.example.com/upload
# URL-кодирование данных
iurl --data-urlencode "name=John Doe" https://api.example.com
# Multipart form-data
iurl -F "name=John" -F "file=@photo.jpg" https://api.example.com/upload# Basic auth
iurl -u user:password https://api.example.com
# Bearer token (через заголовок)
iurl -H "Authorization: Bearer your-token" https://api.example.com# Один заголовок
iurl -H "Accept: application/json" https://api.example.com
# Несколько заголовков
iurl -H "Accept: application/json" -H "X-Custom: value" https://api.example.comiurl --compressed https://api.example.com# Таймаут подключения (5 секунд)
iurl --connect-timeout 5 https://api.example.com
# Общий таймаут запроса (30 секунд)
iurl --max-time 30 https://api.example.com# Следовать редиректам
iurl -L https://example.com/redirect
# Лимит редиректов
iurl -L --max-redirs 5 https://example.com/redirect# Сохранить тело в файл
iurl -o response.json https://api.example.com
# Сохранить с именем из URL
iurl -O https://example.com/file.zip
# Вывести заголовки ответа
iurl -i https://api.example.com
# Формат вывода
iurl -w "%{http_code} %{time_total}s\n" https://api.example.com# IPv4
iurl http://192.168.1.1/api
# IPv6
iurl http://[::1]:8080/health
iurl http://[2001:db8::1]/api
# IPv8 (ASN-dot notation)
iurl 64496.192.0.2.1
iurl http://64496.192.0.2.1/pathiurl -x http://proxy:8080 https://api.example.com
iurl -x http://proxy:8080 --proxy-user user:pass https://api.example.com# Повторить 3 раза при ошибке
iurl --retry 3 https://unstable.example.com
# Задержка между попытками
iurl --retry 3 --retry-delay 2 https://unstable.example.com# Загрузить и сохранить cookies
iurl -b cookies.txt -c cookies.txt https://api.example.com/login
# Только загрузить
iurl -b cookies.txt https://api.example.com/protected# Переменные из файла (JSON, YAML, dotenv)
iurl --vars-file vars.json https://{{host}}/api
# Переменные из командной строки
iurl --var env=prod --var version=1.0 https://api.{{env}}.example.com/{{version}}/data# Извлечь поле
iurl https://api.example.com/users --query '.[0].name'
# Фильтрация
iurl https://api.example.com/logs --query '.[] | select(.level=="error")'
# Агрегация
iurl https://api.example.com/orders --query 'map(.total) | add'# Первый запрос — сохраняет baseline
iurl --diff baseline https://api.example.com/status
# Второй запрос — сравнивает с baseline
iurl --diff baseline https://api.example.com/status# Проверять каждые 10 секунд
iurl --watch 10s https://api.example.com/status
# Каждые 2 минуты
iurl --watch 2m https://api.example.com/status# Сгенерировать Python-код
iurl --generate-code python https://api.example.com
# Go
iurl --generate-code go https://api.example.com
# JavaScript
iurl --generate-code js https://api.example.com
# curl
iurl --generate-code curl https://api.example.com# Сохранить профиль
iurl --save my-request.json -X POST --json '{"key":"value"}' https://api.example.com
# Загрузить и выполнить
iurl --load my-request.json
# Загрузить и переопределить URL
iurl --load my-request.json https://other-api.com# Показать историю
iurl --history
# Поиск по тегу
iurl --tag "auth-test" https://api.example.com/login
iurl --search auth-test
# Повторить запрос из истории
iurl --rerun 42# Конструктор запросов
iurl --build
# Сырой HTTP-диалог
iurl --raw-shell https://api.example.com# Файл конфигурации
iurl -K config.txt
# Формат файла:
# url = https://api.example.com
# method = POST
# header = Content-Type: application/json
# output = response.json
# user = admin:secret# Тихий режим (без вывода)
iurl -s https://api.example.com
# Тихий режим с выводом ошибок
iurl -s -S https://api.example.com
# Ошибка при HTTP 4xx/5xx
iurl --fail https://api.example.com
# Ошибка с телом ответа
iurl --fail-with-body https://api.example.com# Вывести код ответа и время
iurl -w "%{http_code} %{time_total}s\n" https://api.example.com
# Доступные переменные:
# %{http_code} - HTTP статус-код
# %{http_content_type} - Content-Type ответа
# %{time_total} - общее время запроса
# %{size_download} - размер тела
# %{url_effective} - итоговый URL
# %{remote_ip} - IP сервера
# %{remote_port} - порт сервераiurl/
├── cmd/iurl/
│ ├── main.go # Точка входа, оркестрация
│ └── main_test.go # Интеграционные тесты
├── internal/
│ ├── cfg/ # Конфигурация, CLI, шаблоны, переменные
│ │ └── cfg.go
│ ├── http/ # HTTP-клиент, построение запросов
│ │ └── http.go
│ ├── fmt/ # Форматирование JSON с подсветкой
│ │ └── fmt.go
│ ├── cookiejar/ # Cookie jar (Netscape формат)
│ │ ├── cookiejar.go
│ │ └── cookiejar_test.go
│ ├── repl/ # Интерактивный режим (tab-completion)
│ │ └── repl.go
│ ├── query/ # jq-подобная фильтрация JSON
│ │ └── query.go
│ ├── codegen/ # Генерация кода (python/go/js/curl)
│ │ └── codegen.go
│ ├── storage/ # История, профили, diff-кеш
│ │ └── storage.go
│ └── interactive/ # Интерактивный конструктор запросов
│ └── interactive.go
├── Makefile
├── build.sh
└── go.mod
Поток выполнения:
cfg.Parse()— разбор CLI →Configrequest.New()— построениеhttp.RequestизConfighttp.DoWithResult()— выполнение запроса →Resultfmt.PrettyPrintJSON()/CopyRaw()— вывод результата
Зависимости:
github.com/chzyer/readline— tab-completion в REPLgolang.org/x/net— HTTP/2 поддержкаgopkg.in/yaml.v3— YAML переменные
# Локальная сборка
make build
# Сборка для всех платформ
make all
# Тесты
make test
# Линтер
make lint
# Очистка
make clean# Все тесты
go test ./...
# С verbose выводом
go test ./... -v
# Конкретный пакет
go test ./internal/config/ -v
# Интеграционные тесты (с httptest)
go test ./cmd/iurl/ -v- Добавить поле в
Configвinternal/cfg/cfg.go - Зарегистрировать флаг в
Parse() - Обработать логику в
cmd/iurl/main.go - Добавить описание в
PrintHelp() - Написать тест
- Создать директорию
internal/<name>/ - Реализовать логику
- Написать тесты
- Импортировать в
cmd/iurl/main.go
Netscape формат (совместимый с curl):
# Netscape HTTP Cookie File
.domain.com TRUE / FALSE 1735689600 session abc123
Формат: domain \t flag \t path \t secure \t expires \t name \t value
JSON:
{
"url": "https://api.example.com",
"method": "POST",
"headers": {
"Content-Type": "application/json"
},
"body": "{\"key\":\"value\"}",
"insecure": false,
"compressed": true
}JSON в ~/.iurl_history:
{
"entries": [
{
"id": 1,
"timestamp": "2026-01-01T12:00:00Z",
"method": "GET",
"url": "https://api.example.com",
"headers": {},
"tags": ["test"],
"status": 200
}
]
}Для генерации скриптов автодополнения (bash/zsh/fish) используйте:
iurl --completion bash > /etc/bash_completion.d/iurl
iurl --completion zsh > ~/.zsh/completions/_iurl
iurl --completion fish > ~/.config/fish/completions/iurl.fishПроект работает на:
- Linux (amd64, arm64)
- macOS (amd64, arm64)
- Windows (amd64)
История REPL хранится в ~/.iurl_history (нормализация путей через os.PathSeparator).
MIT