web-dev-qa-db-fra.com

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

J'ai trouvé beaucoup d'exemples sur la façon d'utiliser des commandes simples POST dans cURL, mais je n'ai pas trouvé d'exemples sur la façon d'envoyer des commandes HTTP complètes POST, 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.

40
user71020

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}"
13
Tiina

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 POST "body" 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"
57
grawity