如何使用 cURL 显示 POST 数据?

gak*_*gak 169 curl debug

例如,使用 -v 参数 POST 到 Web 服务器:

curl -v http://testserver.com/post -d "firstname=john&lastname=doe"
Run Code Online (Sandbox Code Playgroud)

和输出

> 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)
Run Code Online (Sandbox Code Playgroud)

没有提到我发布的数据。

cURL 中是否有选项可以在输出中显示字符串“firstname=john&lastname=doe”?

注意:显然我想要的字符串在我执行的命令中,但还有其他几个 post 选项,例如 --form 和 --data-ascii 等。我想看到原始数据被发送到服务器。

gak*_*gak 208

我没有使用的最接近的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
Run Code Online (Sandbox Code Playgroud)

不幸的是,这在您发布时不起作用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
Run Code Online (Sandbox Code Playgroud)

  • 而不是`--trace-ascii /dev/stdout`,你可以`--trace-ascii -`(破折号) (5认同)
  • 我知道这是您自己的答案,但我认为您可以接受它作为正确答案。无论如何它为我解决了,谢谢:-) (4认同)
  • 删除任何 `-v` 或 `--verbose`,因为它们覆盖了跟踪指令。 (4认同)
  • @AugustinRiedinger 它适用于 https。我刚刚试了一下,看到了有效载荷。数据是加密的,但由于您是连接的端点,您拥有所有可用的数据,因此 curl 可以看到它。 (2认同)
  • 在 OS X 10.8.5 Mountain Lion 上使用 `--trace-ascii` 对我有用。我上传了一个包含两个图像和一个 json 正文的多部分表单实体,一切都按预期工作 (2认同)

Chr*_*rio 45

或者您可以使用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": "*.*.*.*", 
  "url": "https://httpbin.org/post"
}
Run Code Online (Sandbox Code Playgroud)


Ger*_*ens 22

想添加 netcat 替代品

#!/bin/bash
nc -l 8080 &

curl "http://localhost:8080" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
--data @- <<EOF
{
  "me": "$USER",
  "something": $(date +%s)
}
EOF
Run Code Online (Sandbox Code Playgroud)


cwe*_*ske 12

--trace - 使用 curl 7.58 并向您显示 POST 正文:

$ curl --trace - -d 'foo=bar' http://example.org
== Info: Rebuilt URL to: http://example.org/
== Info:   Trying 2606:2800:220:1:248:1893:25c8:1946...
== Info: TCP_NODELAY set
== Info: Connected to example.org (2606:2800:220:1:248:1893:25c8:1946) port 80 (#0)
=> Send header, 144 bytes (0x90)
0000: 50 4f 53 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d POST / HTTP/1.1.
0010: 0a 48 6f 73 74 3a 20 65 78 61 6d 70 6c 65 2e 6f .Host: example.o
0020: 72 67 0d 0a 55 73 65 72 2d 41 67 65 6e 74 3a 20 rg..User-Agent: 
0030: 63 75 72 6c 2f 37 2e 35 38 2e 30 0d 0a 41 63 63 curl/7.58.0..Acc
0040: 65 70 74 3a 20 2a 2f 2a 0d 0a 43 6f 6e 74 65 6e ept: */*..Conten
0050: 74 2d 4c 65 6e 67 74 68 3a 20 37 0d 0a 43 6f 6e t-Length: 7..Con
0060: 74 65 6e 74 2d 54 79 70 65 3a 20 61 70 70 6c 69 tent-Type: appli
0070: 63 61 74 69 6f 6e 2f 78 2d 77 77 77 2d 66 6f 72 cation/x-www-for
0080: 6d 2d 75 72 6c 65 6e 63 6f 64 65 64 0d 0a 0d 0a m-urlencoded....
=> Send data, 7 bytes (0x7)
0000: 66 6f 6f 3d 62 61 72                            foo=bar
== Info: upload completely sent off: 7 out of 7 bytes
<= Recv header, 17 bytes (0x11)
0000: 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK.
0010: 0a                                              .
<= Recv header, 22 bytes (0x16)
Run Code Online (Sandbox Code Playgroud)


Dor*_*ori 9

您可以使用Charlescurl --proxy localhost:8888. 简单!

  • 不,它不适用于 https。接受的答案很好,更容易。 (4认同)