Cú pháp dòng lệnh cURL để thực hiện một yêu cầu POST là gì?


2187

Làm cách nào tôi có thể thực hiện yêu cầu POST bằng công cụ dòng lệnh cURL ?


curl -d "param1=value1&param2=value2" -X POST http://localhost:3000/data
svikramjeet

Câu trả lời:


2542

Với các trường:

curl --data "param1=value1&param2=value2" https://example.com/resource.cgi

Với các trường được chỉ định riêng:

curl --data "param1=value1" --data "param2=value2" https://example.com/resource.cgi

Đa mục:

curl --form "fileupload=@my-file.txt" https://example.com/resource.cgi

Đa mục với các trường và tên tệp:

curl --form "fileupload=@my-file.txt;filename=desired-filename.txt" --form param1=value1 --form param2=value2 https://example.com/resource.cgi

Không có dữ liệu:

curl --data '' https://example.com/resource.cgi

curl -X POST https://example.com/resource.cgi

curl --request POST https://example.com/resource.cgi

Để biết thêm thông tin, xem hướng dẫn của CURL . Các cURL hướng dẫn về thi đua một trình duyệt web là hữu ích.

Với libcurl, sử dụng curl_formadd()chức năng để xây dựng biểu mẫu của bạn trước khi gửi nó theo cách thông thường. Xem tài liệu libcurl để biết thêm thông tin.

Đối với các tệp lớn, hãy xem xét thêm tham số để hiển thị tiến trình tải lên:

curl --tr-encoding -X POST -v -# -o output -T filename.dat \
  http://example.com/resource.cgi

Các -o outputyêu cầu, nếu không không có thanh tiến trình sẽ xuất hiện.


7
@LauriRanta --data-urlencode(không có dấu gạch ngang), trong các phiên bản gần đây ít nhất
Waitinforatrain

4
Cũng hoạt động nếu bạn cần cập nhật tài nguyên với PUT: curl -X PUT ...
Subfuzion

3
Tôi đang gặp khó khăn trong việc hiểu ... khi nào tôi sẽ làm điều đó With Fields, khi nào Multipartvà khi Without Datanào?
CodyBugstein

7
Thay vì --databạn có thể sử dụng -d.
dùng35538

tôi có một loạt các lĩnh vực. tôi có thể làm cái này như thế nào?
ARUNBALAN NV

507

Đối với POST HTTP RESTful chứa XML:

curl -X POST -d @filename.txt http://example.com/path/to/resource --header "Content-Type:text/xml"

hoặc cho JSON, sử dụng cái này:

curl -X POST -d @filename.txt http://example.com/path/to/resource --header "Content-Type:application/json"

Điều này sẽ đọc nội dung của tệp có tên filename.txtvà gửi nó dưới dạng yêu cầu bài viết.


13
@ tom-wijsman giải thích: curl -X POSTngụ ý một yêu cầu POST HTTP, -dtham số (phiên bản dài --data:) cho curl rằng những gì tiếp theo sẽ là tham số POST và @filenamechỉ định nội dung của tệp filenamelàm tham số. Cách tiếp cận này hoạt động tốt nhất với API HTTP RESTful như được tìm thấy tại Twitter, Facebook, nhiều dịch vụ web khác bao gồm Ruby on Rails cũng như API HTTP của cơ sở dữ liệu như CouchDB. REST là viết tắt của chuyển trạng thái Đại diện
soundmonster

1
Làm thế nào chúng ta có thể thấy phản hồi xml không phải trong một dòng mà được định dạng?
Vitaly Zdanevich

6
Tôi nghĩ rằng bạn có thể rời khỏi -X POSTvì điều đó được ngụ ý bởi -d.
benjifisher

Làm thế nào để cung cấp cho nhiều tiêu đề?
keya

Nhiều tiêu đề: curl -H "header2: 1" -H "header2: 2" ...
Tomáš Kratochvíla

131

Dữ liệu từ stdin với -d @-

Thí dụ:

echo '{"text": "Hello **world**!"}' | curl -d @- https://api.github.com/markdown

Đầu ra:

<p>Hello <strong>world</strong>!</p>

6
Tuyệt vời nếu bạn đã có một đối tượng JSON trong clipboard
Luca Steeb

thậm chí tốt hơn: echo "$ message" | curl -H "Loại nội dung: ứng dụng / json" -d @ - "$ url"
rzr

66
curl -d "name=Rafael%20Sagula&phone=3320780" http://www.where.com/guest.cgi 

là ví dụ được tìm thấy trong Hướng dẫn ví dụ Curl .

Sử dụng% 26 cho ký hiệu thay thế nếu cách trên không hoạt động:

curl -d "name=Rafael%20Sagula%26phone=3320780" http://www.where.com/guest.cgi 

61

Nếu bạn muốn đăng nhập vào một trang web, hãy làm như sau:

curl -d "username=admin&password=admin&submit=Login" --dump-header headers http://localhost/Login
curl -L -b headers http://localhost/

Yêu cầu đầu tiên lưu cookie phiên (được cung cấp khi đăng nhập thành công) trong tệp "tiêu đề". Từ giờ bạn có thể sử dụng cookie đó để xác thực bạn với bất kỳ phần nào của trang web mà bạn thường truy cập sau khi đăng nhập bằng trình duyệt.


6
một lưu ý từ trang man của curl: 'Tùy chọn -c, --cookie-jar là cách tốt hơn để lưu trữ cookie.'
maxschlepzig

32
curl -v --data-ascii var=value http://example.com

và có nhiều lựa chọn hơn, kiểm tra curl --helpđể biết thêm thông tin.


27

Nếu bạn lười biếng, bạn có thể lấy google-chrome để làm tất cả công việc cho bạn.

  1. Bấm chuột phải vào biểu mẫu bạn muốn gửi và chọn Kiểm tra . Điều này sẽ mở bảng DevTools.
  2. Chọn tab Mạng trong devtools và đánh dấu vào hộp kiểm Bảo tồn nhật ký .
  3. Gửi biểu mẫu và định vị mục nhập bằng phương thức POST (nhấp chuột phải vào bất kỳ tiêu đề cột nào và đảm bảo Phương thức được chọn).
  4. Nhấp chuột phải vào dòng bằng POST và chọn Sao chép > Sao chép dưới dạng cURL .

chrome devtools: sao chép dưới dạng cURL

Chrome sẽ sao chép tất cả dữ liệu yêu cầu theo cú pháp cURL.

Chrome sử dụng --data 'param1=hello&param2=world'mà bạn có thể dễ đọc hơn bằng cách sử dụng một -dhoặc -Fmột tham số tùy thuộc vào loại yêu cầu POST bạn muốn gửi, có thể là một trong hai application/x-www-form-urlencodedhoặc multipart/form-datatheo đó.

Đây sẽ là POST-ed dưới dạng application/x-www-form-urlencoded( được sử dụng cho phần lớn các biểu mẫu không chứa tệp tải lên ):

curl http://httpbin.org/post \
    -H "User-Agent: Mozilla/2.2" \
    -d param1=hello \
    -d name=dinsdale

Đối với multipart/form-dataviệc sử dụng POST -F( thường được sử dụng với các biểu mẫu có chứa tệp tải lên hoặc trong đó thứ tự các trường là quan trọng hoặc trong đó yêu cầu nhiều trường có cùng tên ):

curl http://httpbin.org/post \
    -H "User-Agent: Mozilla/2.2" \
    -F param1=hello \
    -F name=dinsdale \
    -F name=piranha

Các User-Agenttiêu đề không bình thường cần thiết, nhưng tôi đã ném nó trong chỉ trong trường hợp. Bạn có thể tránh phải đặt tác nhân người dùng theo mọi yêu cầu bằng cách tạo ~/.curlrctệp chứa vdUser-Agent: "Mozilla/2.2"

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.