Wie zeigen Sie POST-Daten mit cURL an?

140

Beispiel: POST an einen Webserver mit dem Argument -v:

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

Und die Ausgabe

> 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)

Die von mir geposteten Daten werden nicht erwähnt.

Gibt es eine Option in cURL, um die Zeichenfolge "Vorname = John & Nachname = Doe" in der Ausgabe anzuzeigen?

Hinweis: Natürlich ist die gewünschte Zeichenfolge in dem Befehl enthalten, den ich ausgeführt habe. Es gibt jedoch auch einige andere Optionen für das Versenden, z. B. --form und --data-ascii usw. Ich möchte sehen, wie die Rohdaten an den Server gesendet werden.

gak
quelle
1
Sie können auch tcpdump ausführen, um die tatsächlichen Daten zu erfassen, die an den Server gesendet werden. Oder wireshark (besser), wenn Sie das haben.
Keith
Ich bin mir nicht sicher, ob du kannst. Ist dies ein Beispiel für Sicherheit durch Unbekanntheit? - stackoverflow.com/questions/198462/…
slotishtype

Antworten:

176

Das nächste, was ich ohne Verwendung bekommen habe, tcpdumpist die Verwendung der --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

Leider funktioniert dies nicht, wenn Sie posten 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
quelle
4
Ich weiß, dass es Ihre eigene Antwort ist, aber ich denke, Sie können dies als die richtige Antwort akzeptieren. Es hat es trotzdem für mich gelöst, danke :-)
Darren Cook
4
Entfernen Sie alle -voder, --verboseda sie die Trace-Direktive überschreiben.
AlikElzin-kilaka
2
@ AugustinRiedinger Es funktioniert gut mit https. Ich habe es gerade ausprobiert und die Nutzlast gesehen. Die Daten sind verschlüsselt, aber da Sie der Endpunkt der Verbindung sind, stehen Ihnen alle Daten zur Verfügung, sodass curl sie sehen kann.
gak
2
Die Verwendung --trace-asciihat für mich unter OS X 10.8.5 Mountain Lion funktioniert. Ich habe ein mehrteiliges Formularelement mit zwei Bildern und einem JSON-Body hochgeladen und alles hat wie erwartet funktioniert
Heath Borders
4
Statt --trace-ascii /dev/stdoutSie können --trace-ascii -(Dash)
Adam Michalik
27

Oder Sie könnten mit https://httpbin.org/ testen

$ 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
quelle
12

Möchte netcat Alternative hinzufügen

#!/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
quelle
9

Sie könnten Charles und curl --proxy localhost:8888. Simples!

Dori
quelle
4
nein, es funktioniert nicht mit https. Akzeptierte Antwort ist gut und einfacher.
akostadinov
httpswar in der frage keine anforderung: p
Dori
@CasparHarmer Was ist dein Problem mit der akzeptierten Antwort? Wenn Sie mehr brauchen, erledigt TCPdump den Deal.
Gewure
Das ist vor 3 Jahren passiert. Ich kann mich nicht erinnern.
Caspar Harmer