Bagaimana cara mengirim POST dengan body, header, dan params HTTP menggunakan cURL?

39

Saya menemukan banyak contoh tentang cara menggunakan perintah POST sederhana di cURL, tetapi saya tidak menemukan contoh tentang cara mengirim perintah HTTP POST lengkap, yang berisi:

  • Tajuk (Otentikasi Dasar)
  • HTTP Params ( s=1&r=33)
  • Data Tubuh, beberapa string XML

Yang saya temukan adalah:

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

Itu tidak berfungsi, dan mengirimkan parameter HTTP sebagai isi.

pengguna71020
sumber
Terasa seperti kemungkinan penipuan superuser.com/questions/149329/... Saya tahu ini spesifik tentang header dan sejenisnya tetapi jawaban untuk pertanyaan lain juga mengatasinya. Saya biasanya tidak menandai pertanyaan populer yang lama sebagai penipuan tetapi ini merupakan pengecualian. Mungkin perlu memindahkan beberapa barang untuk kelengkapan.
Michael Durrant
Sebenarnya jawaban yang lain sangat spesifik menyebutkan --headerdan yang ini tidak
Michael Durrant

Jawaban:

15

Tidak cukup reputasi untuk berkomentar jadi tinggalkan ini sebagai jawaban berharap itu bisa membantu.

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}

Inilah yang saya gunakan untuk operasi bucket S3 acl put. Header dalam -H dan tubuh yang merupakan file xml dalam $ {aclfile} setelah -T. Anda dapat melihatnya dari output:

/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

jika url params berisi tanda-tanda khusus seperti "+", gunakan --data-urlencode untuk setiap param (berisi tanda-tanda khusus) dari mereka:

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

"Parameter" HTTP adalah bagian dari URL:

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

Otentikasi dasar memiliki opsi terpisah, tidak perlu membuat header khusus:

-u "user:password"

"Badan" POST dapat dikirim melalui --data(untuk application/x-www-form-urlencoded) atau --form(untuk multipart/form-data):

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

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

--data-binary "@binarybody.jpg"

Jadi, untuk meringkas:

curl -d "this is body" -u "user:pass" "http://localhost/?ss=ss&qq=11"
grawity
sumber
@Emerson: Seharusnya; Modul PHP tampaknya memiliki semua fungsi yang dimiliki oleh libcurl C asli, dan di atas adalah fitur yang cukup mendasar. Saya tidak tahu fungsi tepatnya untuk digunakan. Jika Anda tidak dapat menemukannya, tanyakan pada Stack Overflow.
grawity