Comment affichez-vous les données POST avec cURL?

140

Par exemple, le POST sur un serveur Web avec l'argument -v:

curl -v http://testserver.com/post -d "firstname=john&lastname=doe"

Et la sortie

> POST /post HTTP/1.1
> User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3
> Host: testserver.com
> Accept: */*
> Content-Length: 28
> Content-Type: application/x-www-form-urlencoded
> 
< HTTP/1.1 200 OK
(etc)

Il n'y a aucune mention des données que j'ai posté.

Existe-t-il une option dans cURL pour afficher la chaîne "firstname = john & lastname = doe" dans la sortie?

Remarque: évidemment, la chaîne que je veux est dans la commande que j'ai exécutée, mais il existe plusieurs autres options de publication telles que --form et --data-ascii, etc. J'aimerais que les données brutes soient envoyées au serveur.

gak
la source
1
Vous pouvez également exécuter tcpdump pour capturer les données réelles envoyées au serveur. Ou Wireshark (mieux) si vous avez ça.
Keith
Je ne suis pas sûr que tu peux. Est-ce un exemple de sécurité par obscurité? - stackoverflow.com/questions/198462/…
slot type

Réponses:

176

Le plus proche que je me suis sans utiliser tcpdumputilise l' --trace-asciioption:

~ curl http://w3.org/ -d "hello=there" --trace-ascii /dev/stdout
== Info: About to connect() to w3.org port 80 (#0)
== Info:   Trying 128.30.52.45... == Info: connected
== Info: Connected to w3.org (128.30.52.45) port 80 (#0)
=> Send header, 210 bytes (0xd2)
0000: POST / HTTP/1.1
0011: User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.1
0051: 9.7 OpenSSL/0.9.8l zlib/1.2.3
0070: Host: w3.org
007e: Accept: */*
008b: Content-Length: 11
009f: Content-Type: application/x-www-form-urlencoded
00d0: 
=> Send data, 11 bytes (0xb)
0000: hello=there

Malheureusement, cela ne fonctionne pas lorsque vous postez multipart/form-data:

~ curl http://w3.org/ -F hello=there -F testing=123 --trace-ascii /dev/stdout
== Info: About to connect() to w3.org port 80 (#0)
== Info:   Trying 128.30.52.45... == Info: connected
== Info: Connected to w3.org (128.30.52.45) port 80 (#0)
=> Send header, 270 bytes (0x10e)
0000: POST / HTTP/1.1
0011: User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.1
0051: 9.7 OpenSSL/0.9.8l zlib/1.2.3
0070: Host: w3.org
007e: Accept: */*
008b: Content-Length: 244
00a0: Expect: 100-continue
00b6: Content-Type: multipart/form-data; boundary=--------------------
00f6: --------19319e4d1b79
010c: 
<= Recv header, 32 bytes (0x20)
0000: HTTP/1.1 301 Moved Permanently
gak
la source
4
Je sais que c'est votre propre réponse, mais je pense que vous pouvez accepter cela comme étant la bonne réponse. Il a résolu pour moi en tout cas, merci :-)
Darren Cook ,
4
Supprimez any -vou --verbosecar ils écrasent la directive trace.
AlikElzin-kilaka
2
@AugustinRiedinger Cela fonctionne très bien avec https. Je viens d'essayer et vu la charge utile. Les données sont cryptées, mais puisque vous êtes le point de terminaison de la connexion, vous avez toutes les données à votre disposition, ce qui permet à Curl de les voir.
Gak
2
Utilisation a --trace-asciitravaillé pour moi sur OS X 10.8.5 Mountain Lion. J'ai téléchargé une entité de formulaire en plusieurs parties avec deux images et un corps json et tout a fonctionné comme prévu
Heath Borders
4
Au lieu de --trace-ascii /dev/stdoutvous pouvez --trace-ascii -(
Adam
27

Ou vous pouvez tester avec https://httpbin.org/

$ curl https://httpbin.org/post -d "firstname=john&lastname=doe"
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "firstname": "john", 
    "lastname": "doe"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "27", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.43.0"
  }, 
  "json": null, 
  "origin": "78.228.163.126", 
  "url": "https://httpbin.org/post"
}
Christophe Morio
la source
12

Voudrais ajouter une alternative à Netcat

#!/bin/bash
nc -l 8080 &

curl "http://localhost:8080" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
--data @<(cat <<EOF
{
  "me": "$USER",
  "something": $(date +%s)
}
EOF
)
Gert Cuykens
la source
9

Vous pouvez utiliser Charles et curl --proxy localhost:8888. Simples!

Dori
la source
4
non, cela ne fonctionne pas avec https. La réponse acceptée est bien et plus facile.
akostadinov
httpsn'était pas une exigence dans la question: p
Dori
@CasparHarmer quel est votre problème avec la réponse acceptée? Si vous avez besoin de plus, TCPdump fait l'affaire.
Gewure
C'est arrivé il y a 3 ans. Je me rappelle plus.
Caspar Harmer