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

2187

¿Cómo puedo hacer una solicitud POST con la herramienta de línea de comandos cURL ?

mic84
fuente
curl -d "param1=value1&param2=value2" -X POST http://localhost:3000/data
svikramjeet

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 "[email protected]" https://example.com/resource.cgi

Multiparte con campos y un nombre de archivo:

curl --form "[email protected];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.

Stephen Deken
fuente
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.

soundmonster
fuente
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
131

Datos de stdin con -d @-

Ejemplo:

echo '{"text": "Hello **world**!"}' | curl -d @- https://api.github.com/markdown

Salida:

<p>Hello <strong>world</strong>!</p>
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
66
Genial si ya tienes un objeto JSON en el portapapeles
Luca Steeb
aún mejor: echo "$ mensaje" | curl -H "Content-Type: application / json" -d @ - "$ url"
rzr
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 
Patrick Desjardins
fuente
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.

Martin Konecny
fuente
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.

Vinko Vrsalovic
fuente
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"

ccpizza
fuente