Guía cURL POST Request

Aprenda sobre cURL POST Request, qué es, cómo enviar una petición POST con cURL, y más.
13 min read
curl post request guide

curl es una herramienta de línea de comandos para transferir datos utilizando varios protocolos de red. Disponible en los principales sistemas operativos, curl se ha convertido en la herramienta estándar para enviar peticiones HTTP desde la línea de comandos.

La utilidad multiplataforma de curl es compatible con protocolos como HTTP, HTTPS, FTP e IMAP, lo que facilita el envío de peticiones a API y el raspado de sitios web mediante curl. Gracias a su amplia disponibilidad y a su compatibilidad con múltiples protocolos, a menudo encontrará referencias a curl en la documentación de las API REST como una forma rápida de probar las llamadas a las API directamente desde la línea de comandos:

aprenda a enviar peticiones POST utilizando curl desde la línea de comandos

En este artículo, mostraremos cómo enviar peticiones POST utilizando curl desde la línea de comandos.

¿Qué es una petición POST?

Una petición POST es un método HTTP para enviar datos a un servidor y es uno de los métodos HTTP más comunes.

Cuando se envía una petición POST, los datos transmitidos se incluyen en el cuerpo de la petición. Esto permite enviar datos de forma más discreta que enviándolos en la URL (como lo haría con una petición GET). También se puede enviar muchos más datos en una petición POST, eludiendo las restricciones de longitud de URL impuestas por los navegadores para las peticiones GET.

Las peticiones POST se utilizan a menudo para enviar formularios, cargar archivos o enviar datos JSON a una API. En comparación con las peticiones GET, las peticiones POST normalmente no se almacenan en caché y los datos no se muestran en el historial del navegador ya que los datos de la petición están en el cuerpo de la petición.

Cómo enviar una petición POST con curl

Antes de comenzar este tutorial, necesita instalar curl en su ordenador. Ejecute el siguiente comando para comprobar si curl está instalado:

curl --version

Si obtiene un error diciendo que no se puede encontrar el comando, necesita instalar la utilidad.

Instalar curl

A continuación incluimos las instrucciones para instalar curl en los principales sistemas operativos:

Windows

En Windows, se puede utilizar WinGet, el gestor de paquetes predeterminado en Windows 11, para instalar curl:

winget install curl.curl

Chocolatey es otro gestor de paquetes para Windows que permite instalar curl utilizando el siguiente comando:

choco install curl

Linux

curl está disponible en la mayoría de los gestores de paquetes de Linux. Utilice el siguiente comando en Ubuntu/Debian para instalar curl:

apt-get install curl

Red Hat Enterprise Linux (RHEL), CentOS y Fedora permiten instalar curl utilizando el Yellowdog Updater Modified (YUM), de esta forma:

yum install curl

Si está ejecutando OpenSUSE, puede instalar curl utilizando el siguiente comando de terminal:

zypper install curl

Por último, Arch Linux permite usar pacman para instalar curl con este comando:

pacman -Sy curl

macOS

Homebrew es la forma más sencilla de instalar curl en macOS. Asegúrese de tener Homebrew instalado y ejecute el siguiente comando:

brew install curl

Ahora que ha instalado curl en su sistema operativo, puede proceder a aprender a hacer peticiones POST.

Realizar una petición POST

curl permite especificar varias opciones cuando se envían peticiones POST. Las siguientes secciones mostrarán algunas características comunes de curl que puede encontrar al hacer peticiones POST usando la utilidad.

Especificar el método POST

Al realizar peticiones HTTP con curl, debe especificar el método HTTP que desea ejecutar. Los métodos HTTP incluyen GET, POST, PUT y DELETE. curl le permite especificar el método HTTP que desea utilizar utilizando el indicador -X de la línea de comandos.

Por ejemplo, para enviar una solicitud POST a https://httpbin.org/anything, puede ejecutar el siguiente comando curl en su terminal:

curl -X POST https://httpbin.org/anything

httpbin.org se hace eco del cuerpo de la petición y de las cabeceras en la respuesta. La respuesta debería tener este aspecto:

{
  "args": {},
  "data": "",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": null,
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

La opción -X POST es equivalente a utilizar la opción --request POST, por lo que también puede ejecutar el siguiente comando y obtener el mismo resultado:

curl --request POST https://httpbin.org/anything

La respuesta tiene el mismo aspecto que la anterior.

Puede obtener más información sobre las opciones -X y and --request en la documentación oficial.

Establecer el tipo de contenido

Cuando envíe una petición POST, es importante especificar el tipo de contenido que está enviando en el cuerpo de la petición para que el servidor pueda interpretar el cuerpo de la petición correctamente. Puede utilizar tipos MIME en la cabecera Content-Type de una petición HTTP para especificar el formato del cuerpo de la petición.

Por ejemplo, si está enviando JSON en el cuerpo de la solicitud, necesita decirle al servidor web que espere contenido JSON estableciendo el encabezado Content-Type como application/json. Si está enviando XML, su cabecera Content-Type debería ser application/xml. Para más información, consulta la documentación oficial sobre Content-Type.

curl permite especificar cabeceras para una petición HTTP utilizando la bandera -H. Por ejemplo, si está enviando JSON en una petición POST, el siguiente comando curl muestra cómo puede establecer la cabecera Content-Type para la petición:

curl -X POST -H 'Content-Type: application/json' -d '{}' https://httpbin.org/anything

En la respuesta, puede ver que la cabecera Content-Type está establecida en application/json:

{
  "args": {},
  "data": "{}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "2",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=-11111111-111111111111111111111111"
  },
  "json": {},
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

La opción -H también puede especificarse utilizando la opción --header. En este caso, su comando curl se vería así:

curl -X POST --header 'Content-Type: application/json' -d '{}' https://httpbin.org/anything

Su respuesta tendría el mismo aspecto que la anterior.

Enviar datos

Puede que haya notado que los comandos anteriores tenían una bandera -d. Esta opción le permite especificar los datos a enviar en el cuerpo de la petición. Puede usar la bandera para pasar cualquier cadena de valores rodeada por comillas, como esto:

curl -X POST -H 'Content-Type: application/json' -d '{
    "FirstName": "Joe", 
    "LastName": "Soap" 
}' https://httpbin.org/anything

Observará que httpbin.org muestra los datos del cuerpo que ha enviado en la propiedad data de la respuesta.

Si tiene un archivo con datos que desea que curl envíe en el cuerpo, especifique el nombre del archivo prefijado con el caracter @. El siguiente comando lee el contenido de body.json y lo envía a través del cuerpo de la petición:

curl -X POST -H 'Content-Type: application/json' -d @body.json https://httpbin.org/anything

En este caso, el archivo body.json contiene lo siguiente:

{
    "FirstName": "Joe",
    "LastName": "Soap"
}

Al enviar esto, httpbin.org debería devolver la siguiente respuesta:

{
  "args": {},
  "data": "{\t\"FirstName\": \"Joe\",\t\"LastName\": \"Soap\"}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "41",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

La bandera --data se comporta igual que -d, por lo que puede utilizarlas indistintamente.

Envío de datos JSON

En la sección anterior, vio cómo podía enviar datos JSON configurando el encabezado Content-Type como application/json y, a continuación, pasando los datos JSON mediante la bandera -d. Al enviar una solicitud, también es importante que el servidor web sepa qué formato de datos espera como respuesta. Puede usar la cabecera Accept con el valor application/json para hacer saber al servidor web que quiere recibir una respuesta JSON.

El siguiente comando envía una petición JSON al servidor y le indica que desea recibir JSON como respuesta:

curl -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{
    "FirstName": "Joe",
    "LastName": "Soap"
}' https://httpbin.org/anything

Verá que las propiedades data y json del cuerpo de la respuesta contienen los datos JSON que envió en la solicitud:

{
  "args": {},
  "data": "{\n    \"FirstName\": \"Joe\",\n    \"LastName\": \"Soap\"\n}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/json",
    "Content-Length": "50",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

Enviar y recibir datos JSON es común cuando se envían peticiones HTTP, por lo que curl ofrece una opción --json que establece las cabeceras Content-Type y Accept y envía los datos JSON en el cuerpo de la petición. Usando esta opción, puede acortar su comando para enviar JSON en una petición POST:

curl -X POST --json '{
    "FirstName": "Joe",
    "LastName": "Soap"
}' https://httpbin.org/anything

Esto produce la misma respuesta que antes:

{
  "args": {},
  "data": "{\n    \"FirstName\": \"Joe\",\n    \"LastName\": \"Soap\"\n}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/json",
    "Content-Length": "50",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

La bandera --json fue lanzada en la versión 7.82 de curl en Marzo de 2022, así que asegúrate de tener instalada la última versión de curl antes de usarla.

Enviar datos XML

curl también le permite enviar datos en otros formatos, como XML. Para enviar datos XML, necesita establecer su cabecera Content-Type como application/xml y pasar los datos XML en el cuerpo de la petición utilizando la bandera -d. También puede indicar al servidor web que espera que la respuesta sea XML estableciendo la cabecera Accept en application/xml.

El siguiente comando muestra cómo puede enviar un objeto XML en una petición POST utilizando curl:

curl -X POST -H 'Content-Type: application/xml' -H 'Accept: application/xml' -d '<Person>
    <FirstName>Joe</FirstName>
    <LastName>Soap</LastName>
</Person>' https://httpbin.org/anything

Encontrará los datos de la petición XML en la propiedad data devuelta por httpbin.org:

{
  "args": {},
  "data": "<Person>\n    <FirstName>Joe</FirstName>\n    <LastName>Soap</LastName>\n</Person>",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/xml",
    "Content-Length": "79",
    "Content-Type": "application/xml",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": null,
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}
Enviar FormData

Puede utilizar FormData para enviar pares clave-valor de datos a un servidor web. Como su nombre indica, este formato de datos se utiliza al enviar un formulario en una página web. Los pares clave-valor tienen un nombre de campo y un valor.

curl le permite especificar FormData utilizando la bandera -F o --form. Cuando utilice esta opción, especifique el nombre y el valor del campo con el siguiente formato: -F <name=content> o --form <name=content>.

El siguiente fragmento muestra un comando curl que envía una petición POST utilizando FormData con los campos FirstName y LastName:

curl -X POST -F FirstName=Joe -F LastName=Soap https://httpbin.org/anything

Encontrará los nombres y valores de los campos del formulario en la propiedad form del objeto de respuesta httpbin.org:

{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "headers": {
    "Accept": "*/*",
    "Content-Length": "248",
    "Content-Type": "multipart/form-data; boundary=------------------------e2bb56049a60b8b8",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": null,
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

Utilice el indicador -F para cada campo que desee enviar al servidor.

Cargar archivos

Puede usar FormData para subir archivos en una petición POST adjuntando el archivo a un campo. Para que curl sepa que un campo FormData contiene un archivo, introduzca la ruta al archivo en el valor del campo precedido del carácter @.

El siguiente comando curl carga un archivo llamado Contract.pdf en su directorio de trabajo. El comando utiliza un campo llamado File para cargar el archivo:

curl -X POST -F [email protected] https://httpbin.org/anything

La respuesta contiene el archivo completo, por lo que es larga, pero debería tener este aspecto:

{
  "args": {},
  "data": "",
  "files": {
    "File": "..."
  },
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "246",
    "Content-Type": "multipart/form-data; boundary=------------------------19ed1fc3be4d30c7",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": null,
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

Enviar credenciales

Muchos endpoints HTTP requieren autenticación para enviar peticiones. El servidor web decide qué método de autenticación debe utilizar. Uno de estos métodos de autenticación es el esquema de autenticación básica, que permite enviar credenciales consistentes en un nombre de usuario y una contraseña en la solicitud. El servidor verifica las credenciales y, si son correctas, procesa la petición.

curl simplifica el envío de credenciales de autenticación básica utilizando la bandera -u o --user. A continuación, especifique el nombre de usuario y la contraseña y sepárelos con : (dos puntos), de esta forma: -u <username:password>.

El siguiente fragmento utiliza curl para enviar una petición POST con credenciales de usuario y un cuerpo JSON:

curl -X POST -u 'admin:password123' --json '{
    "FirstName": "Joe",
    "LastName": "Soap"
}' https://httpbin.org/anything

Observe cómo curl codifica el nombre de usuario y la contraseña y los envía en la cabecera Authorization:

{
  "args": {},
  "data": "{\n    \"FirstName\": \"Joe\",\n    \"LastName\": \"Soap\"\n}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/json",
    "Authorization": "Basic YWRtaW46cGFzc3dvcmQxMjM=",
    "Content-Length": "50",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

Conclusión

Este artículo le ha mostrado cómo enviar peticiones POST utilizando la utilidad de línea de comandos curl. Ha aprendido a utilizar el indicador -X para especificar que desea enviar una solicitud POST. También ha establecido las cabeceras Content-Type y Accept utilizando las banderas -H y --header para que el servidor web sepa en qué formato están los datos. Para enviar datos en el cuerpo de la petición, usó la bandera -d junto con los datos que quería enviar.

También vió algunos ejemplos de cómo enviar varios tipos de datos, incluyendo JSON, XML y FormData, y aprendió cómo enviar credenciales básicas de autenticación en su petición usando las banderas -u y --user.

Mientras que este artículo demostró las banderas básicas incluidas en curl y cómo utilizarlas, curl ofrece más características que es posible que desee explorar, incluyendo el uso de variables, el envío de cookies con las solicitudes y el envío de solicitudes utilizando un proxy. Muchos lenguajes de programación también proporcionan librerías que permiten trabajar con curl desde ese lenguaje de programación, incluyendo Python, Node.js, y Rust.

¿Busca una solución de raspado de datos web? Hable con uno de nuestros expertos en datos y vea cuál de nuestros productos se adapta mejor a sus necesidades.