จะส่ง POST พร้อมเนื้อหาส่วนหัวและ HTTP โดยใช้ cURL ได้อย่างไร


39

ฉันพบตัวอย่างจำนวนมากเกี่ยวกับวิธีใช้คำสั่ง POST แบบง่ายใน cURL แต่ฉันไม่พบตัวอย่างเกี่ยวกับวิธีส่งคำสั่ง HTTP POST แบบเต็มซึ่งประกอบด้วย:

  • ส่วนหัว (การรับรองความถูกต้องเบื้องต้น)
  • HTTP Params ( s=1&r=33)
  • Data Body บางสตริง XML

ทั้งหมดที่ฉันพบคือ:

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

ไม่ได้ผลและจะส่งพารามิเตอร์ HTTP เป็นเนื้อหา



รู้สึกเหมือนเป็นกลุ่มล่อลวงที่เป็นไปได้ของsuperuser.com/questions/149329/… ฉันรู้ว่าอันนี้มีความเฉพาะเจาะจงเกี่ยวกับส่วนหัวและไม่ชอบ แต่คำตอบสำหรับคำถามอื่น ๆ ก็จัดการได้เช่นกัน ปกติฉันไม่ได้ทำเครื่องหมายคำถามยอดนิยมเช่นนั้นเป็นข้ออ้าง แต่เป็นข้อยกเว้น อาจต้องย้ายบางสิ่งไปเพื่อความสมบูรณ์
Michael Durrant

ในความเป็นจริงคำตอบอื่น ๆ โดยเฉพาะกล่าวถึงอย่างมาก--headerและอันนี้ไม่ได้
Michael Durrant

คำตอบ:


15

ชื่อเสียงไม่เพียงพอที่จะแสดงความคิดเห็นดังนั้นให้ปล่อยไว้เป็นคำตอบโดยหวังว่าจะช่วยได้

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}

นี่คือสิ่งที่ฉันใช้สำหรับการดำเนินการวาง S3 S3 acl ส่วนหัวอยู่ใน -H และเนื้อหาซึ่งเป็นไฟล์ xml อยู่ใน $ {aclfile} ที่ตามหลัง -T คุณสามารถเห็นได้จากผลลัพธ์:

/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

หาก url params มีเครื่องหมายพิเศษเช่น "+" ให้ใช้ --data-urlencode สำหรับทุก param (ที่มีเครื่องหมายพิเศษ) ของพวกเขา:

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

57

HTTP "พารามิเตอร์" เป็นส่วนหนึ่งของ URL:

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

การพิสูจน์ตัวตนพื้นฐานมีตัวเลือกแยกต่างหากไม่จำเป็นต้องสร้างส่วนหัวที่กำหนดเอง:

-u "user:password"

POST "body" สามารถส่งผ่านทาง--data(สำหรับapplication/x-www-form-urlencoded) หรือ--form(สำหรับ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"

ดังนั้นเพื่อสรุป:

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

@Emerson: มันควรจะเป็น; โมดูลของ PHP ดูเหมือนว่าจะมีฟังก์ชั่นทั้งหมดที่ C libcurl ดั้งเดิมมีอยู่และสิ่งที่กล่าวมาข้างต้นเป็นคุณสมบัติพื้นฐานที่ค่อนข้างดี อย่างไรก็ตามฉันไม่ทราบว่าจะใช้ฟังก์ชันใด หากคุณหาไม่พบให้ถามที่ Stack Overflow
grawity
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.