Cómo usar curl en PowerShell

La herramienta de línea de comandos Curl (URL del cliente) se usa comúnmente para enviar o recibir datos a un servidor. La ventaja de la herramienta es que admite múltiples protocolos y ofrece características como autenticación, proxy, currículum de transferencia y más.

También podemos usar Curl en PowerShell, pero hay algunas cosas importantes que debe saber. Y PowerShell también tiene sus propios métodos para transferir datos hacia y desde los servidores.

En este artículo, explicaré cómo puede usar Curl en PowerShell y darle algunos ejemplos.

PowerShell Curl

Curl ha existido desde 1997 y se utiliza para interactuar con los servicios web, para enviar o recuperar datos. La herramienta se usa comúnmente en secuencias de comandos o para automatizar tareas. Naturalmente, es posible que desee usar Curl en sus scripts de PowerShell también.

Ahora, antes de que podamos usar Curl en PowerShell, hay una cosa importante que necesite saber. Hasta PowerShell 6, el curl de comando ha sido un alias en PowerShell para el cmdletInvoke-WebRequest. Esto causó muchos problemas/confusiones, por lo que desde PowerShell 6, el comando curl ahora en realidad llama a la utilidad curl.exe.

Podemos ver esto mirando el comando con elGet-CommandCmdlet tanto en PowerShell 5 como PowerShell 7:

PS 5.1
PS 7

Como puede ver, el comando curl llame al curl.exe en PowerShell 7, tal como esperamos. Pero en PowerShell 5.1, el comando es en realidad un alias.

El problema con esto es que toda la sintaxis delInvoke-WebRequestCmdlet es diferente de Curl, por lo que sus comandos no funcionarán como espere.

Curl se instala en Windows 10/11 de forma predeterminada, pero si no tiene Curl instalado, entonces puedeDescargarlo aquí.

Eliminar el alias curl

Si desea utilizar la utilidad Real Curl Command-Line en PowerShell 5.1, entonces tiene dos opciones. Puede usar curl.exe como comando o eliminar el alias. Prefiero este último porque esto asegurará que sus scripts también funcionen en PowerShell 7. Para eliminar el alias, puede usar el siguiente comando:

Remove-Item alias:curl

Usar curl en PowerShell

Así que echemos un vistazo a algunos ejemplos de cómo usar Curl en PowerShell. En el siguiente ejemplo, mostraré el método verdadero curl y la versión de PowerShell,Invoke-WebRequestpara darle una mejor comprensión de las diferencias.

Solicitud básica de obtención

Para simplemente obtener el contenido de una URL específica, podemos usar los comandos a continuación.

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

Envío de datos

El punto final httpbin que estoy usando en los ejemplos a continuación solo devolverá los datos que le enviamos, pero esto es perfecto en este ejemplo. Para enviar datos con CURL, necesitamos establecer el método HTTP para publicar.

curl -X POST https://httpbin.org/anything -d "test=data"

El método Invoke-WebRequest utiliza el mismo principio, solo con una sintaxis diferente:

$body = "test=data"
Invoke-WebRequest -Uri "https://httpbin.org/anything" -Method POST -Body "test=data"

En los ejemplos anteriores, solo enviamos un valor único al punto final, pero más común es enviar un formulario o enviar múltiples campos al punto final. En Curl podemos hacer esto especificando los campos utilizando el parámetro -f.

# POST form data with multiple fields
curl -X POST https://httpbin.org/post `
  -F "name=John Doe" `
  -F "[email protected]" `
  -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"}'

Al usar elInvoke-WebRequestMétodo, primero podemos crear un hashtable con el formulario de forma que queremos publicar. Y para mantener el código legible, también podemos usar una hashtable yPara almacenar todos los parámetros

$formData = @{
    name = "John Doe"
    email = "[email protected]"
    message = "Hello World"
}

$post = @{
    Uri = "https://httpbin.org/post"
    Method = 'Post'
    Body = $formData
}

Invoke-WebRequest @post

Usando autenticación

La mayoría de las API requieren una forma de autenticación para poder transferir datos con él. Cuando se trata de autenticación, hay diferentes métodos, pero la autenticación básica (nombre de usuario y contraseña) o la autenticación de token de portador son las opciones más utilizadas.

Para usar la autenticación básica con Curl, deberá pasar el nombre de usuario y la contraseña en el formatousername:password. En el siguiente ejemplo, agregaremos el nombre de usuario y la contraseña también en la URL, pero eso es solo para fines de prueba:

curl -u "username:password" https://httpbin.org/basic-auth/username/password

# returns on succesfull authentication
{
  "authenticated": true,
  "user": "username"
}

Al usar el método PowerShell,Invoke-WebRequestPrimero necesitamos crear un objeto de credencial. Puede pedirle al usuario que ingrese las credenciales, con elGet-Credentialcmdlet, pero cuando desee almacenar las credenciales en su script, primero deberá convertirlas en una cadena segura:

# 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

Concluir

Es bueno que Microsoft eliminó el alias de curl en PowerShell 7, porque aunque Curl e Invoke-WebRequest puede parecer similar, Curl tiene muchas más capacilitas. Si está creando scripts que se ejecutarán en otras máquinas, puede usar el comandocurl.exePara asegurarse de que se use Curl en lugar de Invoke-WebRequest.

Espero que le haya gustado este artículo, si tiene alguna pregunta, simplemente deje un comentario a continuación.

Related Posts