จะส่ง payload ผ่านไฟล์ JSON เพื่อหา curl ได้อย่างไร


201

ฉันสามารถสร้างสถานที่ได้สำเร็จด้วยcurlการดำเนินการคำสั่งต่อไปนี้:

$ curl -vX POST https://server/api/v1/places.json -d "
  auth_token=B8dsbz4HExMskqUa6Qhn& \
  place[name]=Fuelstation Central& \
  place[city]=Grossbeeren& \
  place[address]=Buschweg 1& \
  place[latitude]=52.3601& \
  place[longitude]=13.3332& \
  place[washing]=true& \
  place[founded_at_year]=2000& \
  place[products][]=diesel& \
  place[products][]=benzin \
"

HTTP/1.1 201 Createdผลตอบแทนที่เซิร์ฟเวอร์
ตอนนี้ฉันต้องการเก็บเพย์โหลดในไฟล์ JSON ซึ่งมีลักษณะดังนี้:

// testplace.json
{
  "auth_token" : "B8dsbz4HExMskqUa6Qhn",
  "name" : "Fuelstation Central",
  "city" : "Grossbeeren",
  "address" : "Buschweg 1",
  "latitude" : 52.3601,
  "longitude" : 13.3332,
  "washing" : true,
  "founded_at_year" : 2000,
  "products" : ["diesel","benzin"]
}

ดังนั้นฉันจะแก้ไขคำสั่งที่จะดำเนินการเช่นนี้

$ curl -vX POST http://server/api/v1/places.json -d @testplace.json

HTTP/1.1 401 Unauthorizedนี้ล้มเหลวกลับ ทำไม?


1
--data-binaryนอกจากนี้ยังเก็บไว้ในใจว่าถ้าคุณอัปโหลดไฟล์ไบนารีกำลังคุณควรใช้
AhmetB - Google

คำตอบ:


329

curlส่งคำขอ POST application/x-www-form-urlencodedกับชนิดของเนื้อหาเริ่มต้นของ หากคุณต้องการส่งคำขอ JSON คุณจะต้องระบุส่วนหัวประเภทเนื้อหาที่ถูกต้อง:

$ curl -vX POST http://server/api/v1/places.json -d @testplace.json \
--header "Content-Type: application/json"

แต่นั่นจะใช้งานได้หากเซิร์ฟเวอร์ยอมรับอินพุต json .jsonในตอนท้ายของ URL อาจบ่งชี้ว่าการส่งออกเป็น JSON ก็ไม่ได้หมายความว่ามันยังจะจัดการ JSON การป้อนข้อมูล เอกสาร API ควรให้คำแนะนำว่าเป็นเช่นนั้นหรือไม่

เหตุผลที่คุณได้รับ401และไม่ใช่ข้อผิดพลาดอื่น ๆ อาจเป็นเพราะเซิร์ฟเวอร์ไม่สามารถแยกข้อมูลauth_tokenออกจากคำขอของคุณ


8
ฉันพยายามใช้cat file.jsonหลังจากนั้น-dและมีปัญหากับมันจนกระทั่งฉันเรียนรู้จากคำตอบนี้ว่าฉันสามารถ@file.jsonใช้ได้ ขอบคุณ :)
Shadi

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