Làm thế nào để bạn hiển thị dữ liệu POST với cURL?


140

Ví dụ: POST lên máy chủ web với đối số -v:

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

Và đầu ra

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

Không có đề cập đến dữ liệu mà tôi đã đăng.

Có một tùy chọn trong cURL để hiển thị chuỗi "firstname = john & lastname = doe" trong đầu ra không?

Lưu ý: Rõ ràng chuỗi tôi muốn có trong lệnh tôi đã thực thi, nhưng có một số tùy chọn bài đăng khác như --form và --data-ascii, v.v. Tôi muốn xem dữ liệu thô được gửi đến máy chủ.


1
Bạn cũng có thể chạy tcpdump để thu thập dữ liệu thực tế được gửi đến máy chủ. Hoặc wireshark (tốt hơn) nếu bạn có điều đó.
Keith

Tôi không chắc bạn có thể. Đây có phải là một ví dụ về bảo mật bởi tối nghĩa? - stackoverflow.com/questions/198462/
Mạnh

Câu trả lời:


176

Gần nhất tôi có mà không sử dụng tcpdumplà sử dụng --trace-asciitùy chọn:

~ 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

Thật không may, điều này không hoạt động khi bạn đăng bài 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
Tôi biết đó là câu trả lời của riêng bạn, nhưng tôi nghĩ bạn có thể chấp nhận đây là câu trả lời đúng. Nó đã giải quyết nó cho tôi bằng mọi cách, cảm ơn :-)
Darren Cook

4
Loại bỏ bất kỳ -vhoặc --verbosekhi họ ghi đè chỉ thị theo dõi.
AlikElzin-kilaka

2
@AugustinRiedinger Nó hoạt động tốt với https. Tôi chỉ thử nó và thấy tải trọng. Dữ liệu được mã hóa nhưng vì bạn là điểm cuối của kết nối, nên bạn có tất cả dữ liệu có sẵn cho mình và do đó curl có thể nhìn thấy nó.
gak

2
Sử dụng --trace-asciilàm việc cho tôi trên OS X 10.8.5 Mountain Lion. Tôi đã tải lên một thực thể dạng nhiều phần với hai hình ảnh và cơ thể json và mọi thứ hoạt động như mong đợi
Heath

4
Thay vì --trace-ascii /dev/stdoutbạn có thể --trace-ascii -(dấu gạch ngang)
Adam Michalik

27

Hoặc bạn có thể kiểm tra với 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

Muốn thêm netcat thay thế

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

Bạn có thể sử dụng Charlescurl --proxy localhost:8888. Đơn giản!


4
không, nó không hoạt động với https. Câu trả lời được chấp nhận là tốt và dễ dàng hơn.
akostadinov

httpskhông phải là một yêu cầu trong câu hỏi: p
Dori

@CasparHarmer câu hỏi của bạn với câu trả lời được chấp nhận là gì? nếu bạn cần thêm, TCPdump sẽ thỏa thuận.
Gewure

Điều này đã xảy ra 3 năm trước. Tôi không thể nhớ.
Caspar Harmer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.