В современной разработке и администрировании умение отправлять HTTP-запросы прямо из терминала — базовый навык. Независимо от того, тестируете вы API, скачиваете файлы, автоматизируете рутину или проводите разведку, командная строка предлагает мощные встроенные инструменты. На основными игроками в экосистеме Windows являются curl, wget и командлеты PowerShell (в частности, Invoke-WebRequest).
Основные инструменты: что выбрать?
Выбор утилиты зависит от задачи:
- curl — стандарт де-факто для тестирования API. Поддерживает огромное количество протоколов (HTTP/HTTPS, FTP, SFTP, TFTP, Gopher и др.) и тонкую настройку заголовков, методов, данных и сертификатов. Входит в состав Windows 10 (сборка 1803+) и Windows 11.
- wget, идеален для массового скачивания файлов, рекурсивного обхода сайтов и работы с нестабильными соединениями (поддержка докачки).
cURL в Windows: нюансы PowerShell
Важный момент для пользователей PowerShell: исторически curl является псевдонимом (alias) для Invoke-WebRequest.
-X POST, -H, -d) не работают через псевдоним PowerShell.Решение: Явно вызывайте curl.exe.
Примеры вызова curl.exe
# GET запрос с заголовком и игнорированием ошибок сертификата (-k)
curl.exe -k -X GET https://.../api/getRequest -H "Head-Parameter:value"
curl.exe -X POST https://..;/api/data -H "Content-Type: application/json" -d '{"key":"value"}' В классической cmd.exe псевдонима нет, поэтому curl сразу запускает curl.exe.
PowerShell: Invoke-WebRequest (iwr)
Командлет Invoke-WebRequest (алиас iwr, wget) — это «швейцарский нож» для веб-запросов в PS. Он обращается к HTTP/HTTPS/FTP ресурсам и возвращает богатый объект ответа.
Базовый синтаксис
powershell.exe Invoke-WebRequest -Uri http://.../resource -OutFile file.exe Работа с аутентификацией
Поддерживаются: Basic, NTLM, Kerberos, аутентификация по сертификату.
Basic Auth (Имя пользователя + Пароль)
# 1. Безопасное получение учетных данных (диалоговое окно)
$cred = Get-Credential
Invoke-WebRequest -Uri https://... -Credential $cred
wget -Uri https://... -Credential $cred Особенности параметра -Body
Важно: Invoke-WebRequest интеллектуально обрабатывает параметр -Body в зависимости от типа данных и HTTP-метода:
- Если передать хэш-таблицу (Dictionary) при методе POST — данные уйдут как
application/x-www-form-urlencoded(в тело запроса). - Если передать строку JSON — уйдет как
application/json(нужно явно задать-ContentType). - При методе GET данные из
-Bodyмогут быть автоматически преобразованы в параметры URL (Query String).
Типичные сценарии и примеры
Скачивание файлов (wget / Invoke-WebRequest)
# PowerShell (явное указание выходного файла)
Invoke-WebRequest "http://.../file.ps1" -OutFile "file5.ps1"
wget "http://.../putty.exe" -OutFile "putty.exe" Отправка POST запроса с JSON (API тестирование)
$body = @{ name = "Test"; value = 123 } | ConvertTo-Json
$headers = @{ "Authorization" = "Bearer ***"; "Custom-Header" = "Value" }
Invoke-WebRequest -Uri "https://.../api/endpoint" `
-Method Post `
-Body $body `
-ContentType "application/json" `
-Headers $headers Работа с куками и сессиями
Invoke-WebRequest поддерживает параметр -WebSession (объект WebRequestSession), что позволяет сохранять куки между запросами (аналог curl -b / -c).
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$r = Invoke-WebRequest -Uri "https://.../login" -Method Post -Body $credBody -WebSession $session
$r2 = Invoke-WebRequest -Uri "https://.../profile" -WebSession $session Решение частых проблем
Проблема кодировки (ISO-8859-1 vs UTF-8)
PowerShell по умолчанию следует стандарту ISO-8859-1 для ответа, если сервер не прислал заголовок Content-Type с charset. Это приводит к «кракозябрам» вместо кириллицы.
Решение: Явно указать кодировку при чтении контента или принудительно декодировать:
$response = Invoke-WebRequest -Uri "http://..."
$content = [System.Text.Encoding]::UTF8.GetString($response.Content) # для байтов
Самоподписанные сертификаты (SSL/TLS)
Аналог curl -k (--insecure) в PowerShell — обход валидации сертификата через callback (требуется однострочник перед запросом):
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
Invoke-WebRequest -Uri "https://self-signed.."
Конвертация curl в PowerShell код
Если у вас есть готовая команда curl (например, из браузера DevTools -> Copy as cURL), её можно преобразовать в код PowerShell:
- Получите готовый вызов
Invoke-WebRequest с правильными заголовками, методом и телом. - Скопируйте код в скрипт.
Команды разведки и профилирования
При анализе трафика или поиске аномалий полезны комбинации:
- curl / wget — для активного зондирования эндпоинтов.
- ls, grep, findstr, Select-String — для разбора логов и ответов.
- Профилирование трафика помогает выявить атипичные URL-запросы, не характерные для легитимного ПО.
Резюме: шпаргалка по выбору
Задача Рекомендуемый инструмент Ключевой нюанс Быстрый тест API, сложные заголовки, нестандартные методы curl.exe (в cmd или через curl;exe в PS) Нативный синтаксис флагов, максимальная совместимость Скачивание больших файлов, докачка, рекурсия wget (отдельная утилита или псевдоним PS) Ключи -c (continue), -r (recursive) Invoke-WebRequest (iwr) Возвращает объект (.Links, .Forms, .Headers), поддержка -WebSession Простая проверка доступности / статус-код Любой curl.exe -I или (iwr -Uri ... -Method Head).StatusCode
Главное правило: В PowerShell всегда пишите curl.exe, если хотите использовать нативный curl, и используйте Invoke-WebRequest (или алиасы iwr, wget), если пишете нативный PowerShell-скрипт.