Поиск по сайту:

Как использовать 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:

PS 5.1

ПС 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/ip
Invoke-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.

Надеюсь, вам понравилась эта статья. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже.