Как использовать cURL в PowerShell
Командный инструмент cURL (клиентский URL) широко используется для отправки или получения данных с сервера. Преимуществом инструмента является поддержка множества протоколов и наличие таких функций, как аутентификация, прокси, возобновление передачи и многих других.
Мы также можем использовать cURL в PowerShell, но есть несколько важных вещей, которые вам нужно знать. И у PowerShell есть свои собственные методы для передачи данных на серверы и обратно.
В этой статье я объясню, как вы можете использовать cURL в PowerShell, и приведу вам несколько примеров.
PowerShell cURL
cURL существует с 1997 года и используется для взаимодействия с веб-сервисами, для отправки или получения данных. Этот инструмент часто используется в скриптах или для автоматизации задач. Естественно, вы также можете захотеть использовать cURL в своих скриптах PowerShell.
Прежде чем мы сможем использовать cURL в PowerShell, есть одна важная вещь, которую вам нужно знать. До версии PowerShell 6 команда cURL была псевдонимом в PowerShell для командлета Invoke-WebRequest. Это вызвало много проблем и недопонимания, поэтому с версии PowerShell 6 команда cURL теперь на самом деле вызывает утилиту curl.exe.
Мы можем это увидеть, выполнив команду с помощью Get-Command в PowerShell 5 и PowerShell 7:
Как вы можете видеть, команда curl вызывает curl.exe в PowerShell 7, как мы и ожидали. Но в PowerShell 5.1 команда на самом деле является псевдонимом.
Проблема в том, что вся синтаксическая структура Invoke-WebRequest команды отличается от cURL, поэтому ваши команды не будут работать так, как вы ожидаете.
cURL по умолчанию установлен в Windows 10/11, но если у вас нет cURL, вы можете скачать его здесь.
Удаление псевдонима cURL
Если вы хотите использовать реальное командное утилиту cURL в PowerShell 5.1, то у вас есть два варианта. Вы можете использовать curl.exe как команду или удалить псевдоним. Я предпочитаю последний вариант, потому что это гарантирует, что ваши сценарии также будут работать в PowerShell 7. Чтобы удалить псевдоним, вы можете использовать следующую команду:
Remove-Item alias:curlИспользование cURL в PowerShell
Давайте посмотрим на несколько примеров использования cURL в PowerShell. В приведенном ниже примере я покажу истинный метод cURL и версию PowerShell, Invoke-WebRequest, чтобы дать вам лучшее понимание различий.
Основной GET-запрос
Чтобы просто получить содержимое конкретного URL, мы можем использовать команды ниже.
curl https://httpbin.org/ipInvoke-WebRequest -Uri "https://httpbin.org/ip"
In this case it's better to use, because the output is in JSON
Invoke-RestMethod https://httpbin.org/ipОтправка данных
httpbin конечная точка, которую я использую в примерах ниже, просто вернет данные, которые мы отправим ей, но это идеально подходит для этого примера. Чтобы отправить данные с помощью cURL, нам нужно установить HTTP метод на POST.
curl -X POST https://httpbin.org/anything -d "test=data"
Метод Invoke-WebRequest использует тот же принцип, только с другой синтаксисом:
$body = "test=data"
Invoke-WebRequest -Uri "https://httpbin.org/anything" -Method POST -Body "test=data"В приведенных выше примерах мы отправляем только одно значение на конечную точку, но более распространенным является отправка формы или отправка нескольких полей на конечную точку. В cURL мы можем сделать это, указав поля с помощью параметра -F.
POST form data with multiple fields
curl -X POST https://httpbin.org/post `
-F "name=John Doe" `
-F "email=john@example.com" `
-F "message=Hello World"
Or for a JSON payload
curl -X POST https://httpbin.org/post -H "Content-Type: application/json" `
-d '{"field1":"value1","field2":"value2","field3":"value3"}'При использовании метода Invoke-WebRequest мы сначала можем создать хеш-таблицу с данными формы, которые хотим отправить. Чтобы код оставался читаемым, мы также можем использовать хеш-таблицу и распаковку для хранения всех параметров.
$formData = @{
name = "John Doe"
email = "john@example.com"
message = "Hello World"
}
$post = @{
Uri = "https://httpbin.org/post"
Method = 'Post'
Body = $formData
}
Invoke-WebRequest @postИспользование аутентификации
Большинство API требуют форму аутентификации для передачи данных. Когда речь идет об аутентификации, существует несколько методов, но основные методы аутентификации (имя пользователя и пароль) или аутентификация с использованием токена доступа являются наиболее распространенными.
Чтобы использовать базовую аутентификацию с cURL, вам нужно передать имя пользователя и пароль в формате username:password. В приведенном ниже примере мы добавим имя пользователя и пароль также в URL, но это только для тестирования:
curl -u "username:password" https://httpbin.org/basic-auth/username/password
returns on succesfull authentication
{
"authenticated": true,
"user": "username"
}При использовании метода PowerShell, Invoke-WebRequest, сначала необходимо создать объект учетных данных. Вы можете попросить пользователя ввести учетные данные с помощью команды Get-Credential, но если вы хотите сохранить учетные данные в своем скрипте, вам нужно сначала преобразовать их в безопасную строку:
Get the credentials from the user
$Credentials = Get-Credential -UserName "username" -Message "Enter your password"
Or store the credentials in the script
$Password = ConvertTo-SecureString "password" -AsPlainText -Force
$Credentials = New-Object System.Management.Automation.PSCredential ("username", $Password)
Invoke-WebRequest -Uri "https://httpbin.org/basic-auth/username/password" -Credential $Credentials
Завершение
Хорошо, что Microsoft убрала алиас cURL в PowerShell 7, потому что, хотя cURL и Invoke-WebRequest могут выглядеть похоже, у cURL гораздо больше возможностей. Если вы создаете скрипты, которые будут выполняться на других машинах, вы можете использовать команду curl.exe, чтобы быть уверенным, что используется cURL, а не Invoke-WebRequest.
Надеюсь, вам понравилась эта статья. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже.


