46 votes

Comment envoyer un POST avec un corps, des en-têtes et des paramètres HTTP en utilisant cURL ?

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)
  • Params HTTP ( s=1&r=33 )
  • Données du 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.

62voto

James Mertz Points 390

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

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

L'authentification de base dispose d'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é soit par l'intermédiaire de --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 "foo=@foovalue.txt"        # the specified file is sent as an attachment

-d "foo=bar"
-d "foo=<foovalue.txt"
-d "foo=@foovalue.txt"
-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"

21voto

Tiina Points 2446

Je n'ai pas assez de réputation pour commenter, alors je laisse cette réponse en espérant qu'elle m'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 mise en place d'un acl sur un 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 le voir 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 de l'url contiennent des signes spéciaux comme "+", utiliser --data-urlencode pour chacun des paramètres (contenant des signes spéciaux) :

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X