cURL (Client URL) – это классический инструмент командной строки *nix для работы с URL-запросами.
Он позволяет отправлять HTTP/HTTP-запросы, скачивать или отправлять файл на сервер, получать доступ к API, аутентифицироваться в веб-сервисе и т. д.
В этой статье рассказывается о том, как использовать утилиту cURL в среде Windows.
Пользователи Windows часто путают команду cURL с командой Invoke-WebRequest.
Проблема заключается в том, что до PowerShell Core 6.x команда cURL в PowerShell была алиасом для команды Invoke-WebRequest.
🖧 Wcurl: Удобная обёртка Curl для лёгкой загрузки файлов
В PowerShell Core 6.x и 7.x команда cURL запускает инструмент C:\Windows\system32\curl.exe.
Начиная с Windows 10 1803 и Windows Server 2019 команда curl.exe доступна по умолчанию.
Подсказка. Чтобы удалить алиас curl, выполните следующую команду в Windows PowerShell 5.1:
code $profile
Добавьте следующую команду в профиль PowerShell:
Remove-Item Alias:\curl
Убедитесь, что cURL установлен, и проверьте его версию:
curl -V
Синтаксис команды Invoke-WebRequest и утилиты cURL.exe сильно отличаются.
Если вы привыкли использовать команду cURL в среде Linux, вам может показаться сложным перевести знакомые команды в синтаксис PowerShell.
Давайте рассмотрим несколько примеров типичных команд cURL и их эквивалентов в PowerShell.
Получение исходного HTML-содержимого веб-страницы и статуса ответа HTTP:
curl https://itsecforu.ru PS: Invoke-WebRequest -Uri "https://itsecforu.ru"
Получение только статуса страницы и заголовка:
curl -I https://itsecforu.ru PS: Invoke-WebRequest -Uri "https://itsecforu.ru" -Method Head
Доступ к веб-странице с использованием определенного User-Agent:
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135" https://itsecforu.ru PS: $response = Invoke-WebRequest -Uri "https://itsecforu.ru" -UserAgent "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135"
Скачать всю веб-страницу:
curl -o C:\PS\itsecforu.html https://itsecforu.ru PS: Invoke-WebRequest -Uri "https://itsecforu.ru" -OutFile "C:\PS\theitbros_home2.html"
Получение размера файла (размер в байтах, указанный в поле Content-Length):
curl -IL https://download.sysinternals.com/files/PSTools.zip PS: $response = Invoke-WebRequest -Uri "https://download.sysinternals.com/files/PSTools.zip" -Method Head $response.Headers["Content-Length"]
Скачать файл (файл будет сохранен в текущем каталоге: pwd):
curl -O https://itsecforu.ru/test.zip PS: Invoke-WebRequest -Uri "https://itsecforu.ru/test" -OutFile "C:\Downloads\file.zip"
Выполните POST-запрос:
curl -d "key1=value1&key2=value2" -X POST http://service PS: $body = @{ "key1" = "value1" "key2" = "value2" } $response = Invoke-WebRequest -Uri "http://service" ` -Method Post ` -ContentType "application/x-www-form-urlencoded" ` -Body $body
Загрузим файл в формате JSON:
curl -d "@data.json" -H "Content-Type: application/json" -X POST http://service PS: $response = Invoke-WebRequest -Uri "http://api.service" ` -Method Post ` -ContentType "application/json" ` -InFile "data.json"
Отправка HTTP POST-запросов с данными в формате JSON:
curl -X POST https://api.service/data \ -H "Content-Type: application/json" \ -d '{"Country": "UK", "Index": 220}' PS: $response = Invoke-WebRequest -Uri "https://api.service/data" ` -Method Post ` -ContentType "application/json" ` -Body "{`"Country`": `"UK`", `"Index`": 220}"
Пройдите аутентификацию с помощью основных учетных данных:
curl -u username:password http://service PS: $username = "username" $password = ConvertTo-SecureString "password" -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential($username, $password) $response = Invoke-WebRequest -Uri "http://service" ` -Credential $credential ` -Authentication Basic ` -AllowUnencryptedAuthentication
Основное различие между командой WebRequest и командой cURL заключается в том, что PowerShell работает с объектами и возвращает их, а не просто обычный текст. Команда cURL возвращает необработанный текст.
Этот текст должен быть разобран отдельно.
Однако cURL удобнее, если вам нужно отправить сложный HTTP-запрос или автоматически разобрать объект JSON.
см. также: