Bagaimana Anda menampilkan data POST dengan cURL?

140

Sebagai contoh, POSTing ke server web dengan argumen -v:

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

Dan hasilnya

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

Tidak disebutkan data yang saya posting.

Apakah ada opsi di cURL untuk menampilkan string "firstname = john & lastname = doe" di output?

Catatan: Jelas string yang saya inginkan ada di perintah yang saya jalankan, tetapi ada beberapa opsi posting lain seperti --form dan --data-ascii dll. Saya ingin melihat data mentah dikirim ke server.

gak
sumber
1
Anda juga dapat menjalankan tcpdump untuk mengambil data aktual yang dikirim ke server. Atau wireshark (lebih baik) jika Anda memilikinya.
Keith
Saya tidak yakin Anda bisa. Apakah ini contoh keamanan oleh ketidakjelasan? - stackoverflow.com/questions/198462/…
slotishtype

Jawaban:

176

Yang paling dekat yang saya dapatkan tanpa menggunakan tcpdumpadalah menggunakan --trace-asciiopsi:

~ 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

Sayangnya, ini tidak berfungsi ketika Anda memposting 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
sumber
4
Saya tahu itu adalah jawaban Anda sendiri, tetapi saya pikir Anda dapat menerima ini sebagai jawaban yang benar. Itu menyelesaikannya untuk saya, terima kasih :-)
Darren Cook
4
Hapus salah satu -vatau --verbosesaat mereka menimpa jejak jejak.
AlikElzin-kilaka
2
@AugustinRiedinger Berhasil dengan https. Saya baru saja mencobanya dan melihat muatannya. Data dienkripsi tetapi karena Anda adalah titik akhir dari koneksi, Anda memiliki semua data yang tersedia untuk Anda, dan oleh karena itu curl dapat melihatnya.
gak
2
Menggunakan --trace-asciibekerja untuk saya di OS X 10.8.5 Mountain Lion. Saya telah mengunggah entitas bentuk multi bagian dengan dua gambar dan tubuh json dan semuanya berfungsi seperti yang diharapkan
Heath Borders
4
Alih-alih --trace-ascii /dev/stdoutAnda dapat --trace-ascii -(lari)
Adam Michalik
27

Atau Anda dapat menguji dengan 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
sumber
12

Ingin menambahkan alternatif 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
sumber
9

Anda bisa menggunakan Charles dan curl --proxy localhost:8888. Sederhana!

Dori
sumber
4
tidak, ini tidak berfungsi dengan https. Jawaban yang diterima baik dan mudah.
akostadinov
httpsbukan persyaratan dalam pertanyaan: p
Dori
@CasparHarmer apa masalah Anda dengan jawaban yang diterima? jika Anda membutuhkan lebih, TCPdump melakukan kesepakatan.
Gewure
Ini terjadi 3 tahun yang lalu. Saya tidak ingat.
Caspar Harmer