Comment envoyer un POST avec un corps, des en-têtes et des paramètres HTTP à l'aide de cURL?

39

J'ai trouvé beaucoup d'exemples sur la façon d'utiliser des commandes POST simples dans cURL, mais je n'ai pas trouvé d'exemples sur la façon d'envoyer des commandes HTTP POST complètes, qui contiennent:

  • En-têtes (authentification de base)
  • Paramètres HTTP ( s=1&r=33)
  • Données de corps, une chaîne XML

Tout ce que j'ai trouvé c'est:

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

Cela ne fonctionne pas et envoie les paramètres HTTP en tant que corps.

utilisateur71020
la source
Feels comme un possible dupe de superuser.com/questions/149329/... je sais que celui - ci est spécifique au sujet des en- têtes et similaires , mais les réponses à l'autre question traitent également. Je ne qualifie généralement pas une vieille question populaire de dupe, mais c'est une exception. Il faudra peut-être déplacer certaines choses pour qu'elles soient complètes.
Michael Durrant
En fait, l’autre réponse mentionne très précisément --headerce qui n’est pas le cas
Michael Durrant

Réponses:

15

Pas assez de réputation pour commenter, alors laissez cela comme une réponse en espérant que cela vous aidera.

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}

C’est ce que j’ai utilisé pour une opération de vente de seau S3. Les en-têtes sont dans -H et le corps qui est un fichier xml est dans $ {aclfile} après -T. Vous pouvez voir cela dans la sortie:

/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 les paramètres url contiennent des signes spéciaux tels que "+", utilisez --data-urlencode pour chaque paramètre (contenant des signes spéciaux):

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

Les "paramètres" HTTP font partie de l'URL:

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

L'authentification de base a une option distincte, il n'est pas nécessaire de créer un en-tête personnalisé:

-u "user:password"

Le "corps" POST peut être envoyé via --data(pour application/x-www-form-urlencoded) ou --form(pour 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"

Donc, pour résumer:

curl -d "this is body" -u "user:pass" "http://localhost/?ss=ss&qq=11"
Grawity
la source
@ Emerson: Cela devrait être; Le module de PHP semble avoir toutes les fonctions du C libcurl original, et ce qui précède est une fonctionnalité assez basique. Je ne connais pas la fonction exacte à utiliser, cependant. Si vous ne pouvez pas le trouver, demandez le débordement de pile.
Grawity