cURLでPOSTデータをどのように表示しますか?


137

例として、-v引数を使用してWebサーバーにPOSTします。

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

そして出力

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

私が投稿したデータに関する言及はありません。

出力に文字列「firstname = john&lastname = doe」を表示するオプションがcURLにありますか?

注:当然、私が実行したい文字列は実行したコマンドにありますが、--formや--data-asciiなど、他の投稿オプションもいくつかあります。生データがサーバーに送信されていることを確認します。


1
tcpdumpを実行して、サーバーに送信される実際のデータをキャプチャすることもできます。または、wireshark(より良い)があれば。
キース

できるかどうかわかりません。これはあいまいさによるセキュリティの例ですか?- stackoverflow.com/questions/198462/...
slotishtype

回答:


172

使用せずに得た最も近いオプションtcpdumpを使用してい--trace-asciiます:

~ 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

残念ながら、投稿しているときにはこれは機能しません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

4
私はそれがあなた自身の答えであることを知っていますが、これを正しい答えとして受け入れることができると思います。それは感謝:-)、とにかく私のためにそれを解決
ダレン・クック

4
traceディレクティブをオーバーライドするため、いずれ-v--verboseを削除します。
AlikElzin-kilaka

2
@AugustinRiedinger httpsで問題なく動作します。試したところ、ペイロードを見ました。データは暗号化されますが、ユーザーは接続のエンドポイントであるため、すべてのデータを利用できるため、curlはそれを見ることができます。
gak 14

2
--trace-asciiOS X 10.8.5 Mountain Lionでの使用はうまくいきました。私は、2枚の画像をマルチパートフォームのエンティティをアップロードしたとJSON本体とすべてが期待通りに働いていた
ヒース国境

4
代わりに--trace-ascii /dev/stdoutすることができます--trace-ascii -(ダッシュ)
アダムMichalik

27

または、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"
}

12

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
)

9

Charlesとを使用できますcurl --proxy localhost:8888。シンプル!


4
いいえ、httpsでは機能しません。受け入れられた答えは結構簡単です。
アコスタディノフ

https質問の要件ではありませんでした:p
ドリ

@CasparHarmer受け入れられた答えのあなたの問題は何ですか?さらに必要な場合は、TCPdumpが対処します。
ゲウレ

これは3年前に起こりました。思い出せない。
キャスパーハーマー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.