¿Cómo enviar POST con cuerpo, encabezados y parámetros HTTP usando cURL?

39

Encontré muchos ejemplos sobre cómo usar comandos POST simples en cURL, pero no encontré ejemplos sobre cómo enviar comandos HTTP POST completos, que contienen:

  • Encabezados (autenticación básica)
  • Parámetros HTTP ( s=1&r=33)
  • Datos del cuerpo, alguna cadena XML

Todo lo que encontré es:

echo "this is body" | curl -d "ss=ss&qq=11" http://localhost/

Eso no funciona, y envía los parámetros HTTP como el cuerpo.

usuario71020
fuente
Se siente como un posible engañado de superuser.com/questions/149329/… Sé que este es específico sobre los encabezados y similares, pero las respuestas a la otra pregunta también manejan eso. Por lo general, no marco una pregunta popular tan antigua como un tonto, pero esta es una excepción. Podría necesitar mover algunas cosas para completar.
Michael Durrant
De hecho, la otra respuesta menciona muy específicamente --headery esta no
Michael Durrant

Respuestas:

15

No hay suficiente reputación para comentar, así que deje esto como una respuesta esperando que ayude.

curl -L -v --post301 --post302 -i -X PUT -T "${aclfile}"  \
  -H "Date: ${dateValue}" \
  -H "Content-Type: ${contentType}" \
  -H "Authorization: AWS ${s3Key}:${signature}" \
  ${host}:${port}${resource}

Esto es lo que usé para una operación de colocación de cubo de S3. Los encabezados están en -H y el cuerpo, que es un archivo xml, está en $ {aclfile} después de -T. Puedes ver eso desde la salida:

/aaa/?acl
* About to connect() to 192.168.57.101 port 80 (#0)
*   Trying 192.168.57.101...
* Connected to 192.168.57.101 (192.168.57.101) port 80 (#0)
> PUT /aaa/?acl HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 192.168.57.101
> Accept: */*
> Date: Thu, 18 Aug 2016 08:01:44 GMT
> Content-Type: application/x-www-form-urlencoded; charset=utf-8
> Authorization: AWS WFBZ1S6SO0DZHW2LRM6U:r84lr/lPO0JCpfk5M3GRJfHdUgQ=
> Content-Length: 323
> Expect: 100-continue
>
< HTTP/1.1 100 CONTINUE
HTTP/1.1 100 CONTINUE

* We are completely uploaded and fine
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< x-amz-request-id: tx00000000000000000001f-0057b56b69-31d42-default
x-amz-request-id: tx00000000000000000001f-0057b56b69-31d42-default
< Content-Type: application/xml
Content-Type: application/xml
< Content-Length: 0
Content-Length: 0
< Date: Thu, 18 Aug 2016 08:01:45 GMT
Date: Thu, 18 Aug 2016 08:01:45 GMT

<
* Connection #0 to host 192.168.57.101 left intact

si los parámetros de URL contienen signos especiales como "+", use --data-urlencode para cada parámetro (que contenga signos especiales) de ellos:

curl -G -H "Accept:..." -H "..." --data-urlencode "beginTime=${time}+${zone}" --data-urlencode "endTime=${time}+${zone}" "${url}"
Tiina
fuente
57

Los "parámetros" HTTP son parte de la URL:

"http://localhost/?name=value&othername=othervalue"

La autenticación básica tiene una opción separada, no es necesario crear un encabezado personalizado:

-u "user:password"

El "cuerpo" POST puede enviarse a través de --data(for application/x-www-form-urlencoded) o --form(for multipart/form-data):

-F "foo=bar"                  # 'foo' value is 'bar'
-F "foo=<foovalue.txt"        # the specified file is sent as plain text input
-F "[email protected]"        # the specified file is sent as an attachment

-d "foo=bar"
-d "foo=<foovalue.txt"
-d "[email protected]"
-d "@entirebody.txt"          # the specified file is used as the POST body

--data-binary "@binarybody.jpg"

Entonces, para resumir:

curl -d "this is body" -u "user:pass" "http://localhost/?ss=ss&qq=11"
Gravedad
fuente
@Emerson: Debería ser; El módulo de PHP parece tener todas las funciones que tiene el libcurl C original, y lo anterior es una característica bastante básica. Sin embargo, no sé la función exacta que debo usar. Si no puede encontrarlo, pregunte en Stack Overflow.
Grawity