¿Cuál es la sintaxis de línea de comandos cURL para hacer una solicitud POST?


Respuestas:


2542

Con campos:

curl --data "param1=value1&param2=value2" https://example.com/resource.cgi

Con campos especificados individualmente:

curl --data "param1=value1" --data "param2=value2" https://example.com/resource.cgi

Multiparte:

curl --form "fileupload=@my-file.txt" https://example.com/resource.cgi

Multiparte con campos y un nombre de archivo:

curl --form "fileupload=@my-file.txt;filename=desired-filename.txt" --form param1=value1 --form param2=value2 https://example.com/resource.cgi

Sin datos:

curl --data '' https://example.com/resource.cgi

curl -X POST https://example.com/resource.cgi

curl --request POST https://example.com/resource.cgi

Para obtener más información, consulte el manual de cURL . El tutorial de cURL sobre la emulación de un navegador web es útil.

Con libcurl, use la curl_formadd()función para construir su formulario antes de enviarlo de la manera habitual. Consulte la documentación de libcurl para obtener más información.

Para archivos grandes, considere agregar parámetros para mostrar el progreso de carga:

curl --tr-encoding -X POST -v -# -o output -T filename.dat \
  http://example.com/resource.cgi

Se -o outputrequiere, de lo contrario no aparecerá la barra de progreso.


77
@LauriRanta --data-urlencode(sin guión), al menos en versiones recientes
waitinforatrain

44
También funciona si necesita actualizar un recurso con un PUT: curl -X PUT ...
Subfuzion

3
Tengo problemas para entender ... ¿cuándo lo haría With Fields, cuándo Multiparty cuándo Without Data?
CodyBugstein

77
En lugar de --dataque pueda usar -d.
user35538

Tengo una gran variedad de campos. ¿Cómo puedo hacer esto?
ARUNBALAN NV

508

Para una POST HTTP RESTful que contiene XML:

curl -X POST -d @filename.txt http://example.com/path/to/resource --header "Content-Type:text/xml"

o para JSON, use esto:

curl -X POST -d @filename.txt http://example.com/path/to/resource --header "Content-Type:application/json"

Esto leerá el contenido del archivo nombrado filename.txty lo enviará como solicitud posterior.


13
@ tom-wijsman explicación: curl -X POSTimplica una solicitud HTTP POST, el -dparámetro (versión larga :) --datale dice a curl que lo que sigue serán parámetros POST y @filenamedesigna el contenido del archivo filenamecomo parámetro. Este enfoque funciona mejor con las API RESTful HTTP que se encuentran en Twitter, Facebook, varios otros servicios web, incluido Ruby on Rails, así como las API HTTP de bases de datos como CouchDB. REST significa Transferencia de estado representativa
soundmonster

1
¿Cómo podemos ver la respuesta xml no en una línea sino formateada?
Vitaly Zdanevich

66
Creo que puedes dejar de lado -X POSTya que eso está implícito -d.
benjifisher

¿Cómo dar múltiples encabezados?
keya

Encabezados múltiples: rizo -H "encabezado2: 1" -H "encabezado2: 2" ...
Tomáš Kratochvíla


66
curl -d "name=Rafael%20Sagula&phone=3320780" http://www.where.com/guest.cgi 

es el ejemplo encontrado en el Curl Example Manual .

Use% 26 para los símbolos de sin embargo si lo anterior no funciona:

curl -d "name=Rafael%20Sagula%26phone=3320780" http://www.where.com/guest.cgi 

61

Si desea iniciar sesión en un sitio, haga lo siguiente:

curl -d "username=admin&password=admin&submit=Login" --dump-header headers http://localhost/Login
curl -L -b headers http://localhost/

La primera solicitud guarda la cookie de sesión (que se proporciona al iniciar sesión correctamente) en el archivo "encabezados". A partir de ahora, puede usar esa cookie para autenticarlo en cualquier parte del sitio web al que generalmente acceda después de iniciar sesión con un navegador.


66
una nota de la página de manual de curl: "La opción -c, --cookie-jar es, sin embargo, una mejor manera de almacenar cookies".
maxschlepzig

32
curl -v --data-ascii var=value http://example.com

y hay muchas más opciones, consulte curl --helppara obtener más información.


27

Si eres flojo, puedes hacer que google-chrome haga todo el trabajo por ti.

  1. Haga clic derecho en el formulario que desea enviar y seleccione Inspeccionar . Esto abrirá el panel DevTools.
  2. Seleccione la pestaña Red en devtools y marque la casilla Conservar registro .
  3. Envíe el formulario y ubique la entrada con el método POST (haga clic con el botón derecho en cualquier encabezado de columna y asegúrese de que el Método esté marcado).
  4. Haga clic derecho en la línea con POST y seleccione Copiar > Copiar como cURL .

Devtools de Chrome: copiar como cURL

Chrome copiará todos los datos de la solicitud en sintaxis de cURL.

Chrome utiliza --data 'param1=hello&param2=world'lo que puede hacer más legible mediante el uso de un solo parámetro -do -Fpor parámetro, según el tipo de solicitud POST que desea enviar, que puede ser application/x-www-form-urlencodedo en multipart/form-dataconsecuencia.

Esto se PUBLICARÁ como application/x-www-form-urlencoded( utilizado para la mayoría de los formularios que no contienen cargas de archivos ):

curl http://httpbin.org/post \
    -H "User-Agent: Mozilla/2.2" \
    -d param1=hello \
    -d name=dinsdale

Para un multipart/form-datauso POST -F( generalmente usado con formularios que contienen cargas de archivos, o donde el orden de los campos es importante, o donde se requieren múltiples campos con el mismo nombre ):

curl http://httpbin.org/post \
    -H "User-Agent: Mozilla/2.2" \
    -F param1=hello \
    -F name=dinsdale \
    -F name=piranha

El User-Agentencabezado normalmente no es necesario, pero lo he arrojado por si acaso. Puede evitar tener que configurar el agente de usuario en cada solicitud creando el ~/.curlrcarchivo que contiene, por ejemplo,User-Agent: "Mozilla/2.2"