วิธีโพสต์ JSON เป็น PHP ด้วย curl


108

ฉันอาจจะออกจากฐาน แต่ฉันพยายามมาตลอดทั้งบ่ายเพื่อเรียกใช้คำสั่ง curl postในบทช่วยสอนกรอบ PHP แบบถอยนี้ สิ่งที่ฉันไม่เข้าใจคือ PHP ควรตีความ POST ของฉันอย่างไรมันมักจะปรากฏเป็นอาร์เรย์ว่างเสมอ

curl -i -X POST -d '{"screencast":{"subject":"tools"}}'  \
      http://localhost:3570/index.php/trainingServer/screencast.json

(เครื่องหมายทับในนั้นเป็นเพียงเพื่อให้ฉันไม่ดูเหมือนคนงี่เง่า แต่ฉันดำเนินการจาก windows โดยใช้ PHP 5.2 และลองบนเซิร์ฟเวอร์ Linux เวอร์ชันเดียวกันกับ Linux curl)

ต้องมีบางอย่างที่ฉันขาดหายไปเพราะมันดูตรงไปตรงมาโพสต์นั้นตีความไม่ถูกถ้าเป็นเช่นนั้นทุกอย่างจะทำงานได้ดี

นี่คือสิ่งที่ฉันได้รับกลับมา:

HTTP / 1.1 409 ความขัดแย้ง
วันที่: ศุกร์ที่ 01 พฤษภาคม 2552 22:03:00 GMT
เซิร์ฟเวอร์: Apache / 2.2.8 (Win32) PHP / 5.2.6
X-Powered-By: PHP / 5.2.6
Transfer-Encoding: chunked
ประเภทเนื้อหา: text / html; charset = iso-8859-1

{"screencast": {"id": null, "subject": null, "body": null,
         "dataUrl": null, "dataMedium": null, "createdOn": null, "author": null}}

คุณช่วยคัดลอกวางไฟล์. php ของคุณด้วยได้ไหม คุณแน่ใจหรือไม่ว่า URL localhost: 3570 / index.php / trainingServer / screencast.jsonเรียกใช้สคริปต์ของคุณ ดูเหมือน URL PHP ไม่ได้
จุด

@pts; Peter ใช้เฟรมเวิร์ก MVC บางประเภทลองดูที่ index.php ใน URL นั้น
Alan Storm

@pts ฉันใช้ Delphi สำหรับ PHP (ดังนั้นจึงเป็น: 3570) และเฟรมเวิร์ก Recess MVC พร้อมไฟล์. htaccess ดังนั้น index.php / ใน url
Peter Turner

7
อย่าลืมส่งเป็นapplication/json.
Gumbo

1
ไม่จำเป็นต้องหลีกเลี่ยงเครื่องหมายคำพูดคู่เมื่อฝังไว้ในคำพูดง่ายๆ

คำตอบ:


107

การวิเคราะห์ Jordans ว่าเหตุใดอาร์เรย์ $ _POST จึงไม่ได้รับการเติมข้อมูลนั้นถูกต้อง อย่างไรก็ตามคุณสามารถใช้ไฟล์

$data = file_get_contents("php://input");

เพื่อดึงเนื้อหา http และจัดการด้วยตัวคุณเอง ดูPHP กระแสอินพุต

จากมุมมองของโปรโตคอลสิ่งนี้ถูกต้องมากกว่าเนื่องจากคุณไม่ได้ประมวลผลข้อมูลฟอร์มหลายส่วนของ http จริงๆ นอกจากนี้ให้ใช้ application / json เป็นประเภทเนื้อหาเมื่อโพสต์คำขอของคุณ


7
การทำ json_decode (file_get_contents ("php: // input"), true) ทำงานได้ ขอบคุณ
Peter Turner

ช่วยสถานการณ์ของฉันด้วย! ขอบคุณ Emil H!
Steve

แฟนตาซี ฉันมีปัญหาอย่างมากกับ Zend ที่คิดว่ามันกำลังลอกโพสต์ .. การสกัดง่ายๆที่ใช้ได้ผลกับฉัน นอกจากนี้ Peter Turners ยังเพิ่ม json_decode () ให้วัตถุ \ stdClass ฉันใช้มันเพื่อตอบสนองการ ping ของ Garmin API
JI-Web

120

โดยปกติพารามิเตอร์-dจะถูกตีความว่าเข้ารหัสแบบฟอร์ม คุณต้องการ-Hพารามิเตอร์:

curl -v -H "Content-Type: application/json" -X POST -d '{"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json

18

ฉันเชื่อว่าคุณได้รับอาร์เรย์ว่างเปล่าเนื่องจาก PHP คาดว่าข้อมูลที่โพสต์จะอยู่ในรูปแบบ Querystring (key = value & key1 = value1)

ลองเปลี่ยนคำขอ curl ของคุณเป็น:

curl -i -X POST -d 'json={"screencast":{"subject":"tools"}}'  \
      http://localhost:3570/index.php/trainingServer/screencast.json

และดูว่าช่วยได้หรือไม่


ใช่-H "Content-Type: application/json"ไม่ได้ผลสำหรับฉัน
PJ Brunet

13

คุณต้องตั้งค่าแฟล็กเพิ่มเติมเล็กน้อยเพื่อให้ curl ส่งข้อมูลเป็น JSON

คำสั่ง

$ curl -H "Content-Type: application/json" \
       -X POST \
       -d '{"JSON": "HERE"}' \
       http://localhost:3000/api/url

ธง

  • -H: ส่วนหัวที่กำหนดเองอาร์กิวเมนต์ถัดไปคาดว่าจะเป็นส่วนหัว
  • -X: กริยา HTTP ที่กำหนดเองอาร์กิวเมนต์ถัดไปคาดว่าจะเป็นคำกริยา
  • -d: ส่งอาร์กิวเมนต์ถัดไปเป็นข้อมูลในคำขอ HTTP POST

ทรัพยากร


1

คุณควรหลีกเลี่ยงคำพูดเช่นนี้:

curl -i -X POST -d '{\"screencast\":{\"subject\":\"tools\"}}'  \
  http://localhost:3570/index.php/trainingServer/screencast.json

ใน Windows สิ่งนี้ใช้งานได้จริงสำหรับฉัน แต่ใช้เครื่องหมายคำพูดคู่เพื่อใส่สตริง json ทั้งหมด
meatvest

บน windows คุณต้องหลีกเลี่ยงเครื่องหมายคำพูดคู่ตามที่ Josef แนะนำไว้ข้างต้น เขาพูดถูก.
Bobo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.