Làm cách nào để gửi POST với thân, tiêu đề và thông số HTTP bằng cURL?


39

Tôi đã tìm thấy rất nhiều ví dụ về cách sử dụng các lệnh POST đơn giản trong cURL, nhưng tôi không tìm thấy các ví dụ về cách gửi các lệnh POST HTTP đầy đủ, có chứa:

  • Tiêu đề (Xác thực cơ bản)
  • Param HTTP ( s=1&r=33)
  • Dữ liệu cơ thể, một số chuỗi XML

Tất cả tôi tìm thấy là:

echo "this is body" | curl -d "ss=ss&qq=11" http://localhost/

Điều đó không hoạt động và nó sẽ gửi các tham số HTTP dưới dạng phần thân.



Cảm thấy giống như một bản sao có thể có của superuser.com/questions/149329/ nam Tôi biết cái này là cụ thể về tiêu đề và những thứ tương tự nhưng câu trả lời cho câu hỏi khác cũng xử lý điều đó. Tôi thường không đánh dấu một câu hỏi phổ biến cũ như một bản dupe nhưng đây là một ngoại lệ. Có thể cần phải di chuyển một số thứ cho đầy đủ.
Michael Durrant

Trong thực tế, câu trả lời khác đề cập rất cụ thể --headervà câu trả lời này thì không
Michael Durrant

Câu trả lời:


15

Không đủ danh tiếng để bình luận vì vậy hãy để lại như một câu trả lời hy vọng nó sẽ giúp.

curl -L -v --post301 --post302 -i -X PUT -T "${aclfile}"  \
  -H "Date: ${dateValue}" \
  -H "Content-Type: ${contentType}" \
  -H "Authorization: AWS ${s3Key}:${signature}" \
  ${host}:${port}${resource}

Đây là những gì tôi đã sử dụng cho một hoạt động đặt thùng S3 acl. Các tiêu đề nằm trong -H và phần thân là tệp xml nằm trong $ {aclfile} sau -T. Bạn có thể thấy điều đó từ đầu ra:

/aaa/?acl
* About to connect() to 192.168.57.101 port 80 (#0)
*   Trying 192.168.57.101...
* Connected to 192.168.57.101 (192.168.57.101) port 80 (#0)
> PUT /aaa/?acl HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 192.168.57.101
> Accept: */*
> Date: Thu, 18 Aug 2016 08:01:44 GMT
> Content-Type: application/x-www-form-urlencoded; charset=utf-8
> Authorization: AWS WFBZ1S6SO0DZHW2LRM6U:r84lr/lPO0JCpfk5M3GRJfHdUgQ=
> Content-Length: 323
> Expect: 100-continue
>
< HTTP/1.1 100 CONTINUE
HTTP/1.1 100 CONTINUE

* We are completely uploaded and fine
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< x-amz-request-id: tx00000000000000000001f-0057b56b69-31d42-default
x-amz-request-id: tx00000000000000000001f-0057b56b69-31d42-default
< Content-Type: application/xml
Content-Type: application/xml
< Content-Length: 0
Content-Length: 0
< Date: Thu, 18 Aug 2016 08:01:45 GMT
Date: Thu, 18 Aug 2016 08:01:45 GMT

<
* Connection #0 to host 192.168.57.101 left intact

nếu thông số url chứa các dấu hiệu đặc biệt như "+", hãy sử dụng --data-urlencode cho mỗi thông số (chứa các dấu hiệu đặc biệt) của chúng:

curl -G -H "Accept:..." -H "..." --data-urlencode "beginTime=${time}+${zone}" --data-urlencode "endTime=${time}+${zone}" "${url}"

57

"Tham số" HTTP là một phần của URL:

"http://localhost/?name=value&othername=othervalue"

Xác thực cơ bản có một tùy chọn riêng, không cần tạo tiêu đề tùy chỉnh:

-u "user:password"

POST "body" có thể được gửi qua --data(for application/x-www-form-urlencoded) hoặc --form(for multipart/form-data):

-F "foo=bar"                  # 'foo' value is 'bar'
-F "foo=<foovalue.txt"        # the specified file is sent as plain text input
-F "foo=@foovalue.txt"        # the specified file is sent as an attachment

-d "foo=bar"
-d "foo=<foovalue.txt"
-d "foo=@foovalue.txt"
-d "@entirebody.txt"          # the specified file is used as the POST body

--data-binary "@binarybody.jpg"

Vì vậy, để tóm tắt:

curl -d "this is body" -u "user:pass" "http://localhost/?ss=ss&qq=11"

@Emerson: Nó nên được; Mô-đun của PHP dường như có tất cả các chức năng mà C libcurl ban đầu có, và ở trên là một tính năng khá cơ bản. Tôi không biết chức năng chính xác để sử dụng, tuy nhiên. Nếu bạn không thể tìm thấy nó, hãy hỏi về Stack Overflow.
grawity
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.