Отправить запрос через командную строку

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

В современной разработке и администрировании умение отправлять 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.

Проблема: Флаги нативного curl.exe (например, -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:

  1. Получите готовый вызов Invoke-WebRequest с правильными заголовками, методом и телом.
  2. Скопируйте код в скрипт.

Команды разведки и профилирования

При анализе трафика или поиске аномалий полезны комбинации:

  • 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-скрипт.