วิธีใส่วัตถุ json ด้วยอาร์เรย์โดยใช้ curl


101

ฉันมีชุดข้อมูลที่จะป้อนลงในฐานข้อมูล อินเทอร์เฟซผู้ใช้ในการป้อนข้อมูลไม่ดีสำหรับการป้อนข้อมูลจำนวนมากดังนั้นฉันจึงพยายามกำหนดบรรทัดคำสั่งที่เทียบเท่า เมื่อฉันตรวจสอบคำขอเครือข่ายของ UI ใน chrome ฉันเห็นคำขอ PUT ของวัตถุ json เมื่อฉันพยายามทำซ้ำคำขอ

curl -H 'Accept: application/json' -X PUT '{"tags":["tag1","tag2"],"question":"Which band?","answers":[{"id":"a0","answer":"Answer1"},{"id":"a1","answer":"answer2"}]}' http://example.com/service`

ฉันได้รับข้อผิดพลาด

curl: (3) [globbing] วงเล็บปีกกาที่ซ้อนกันไม่รองรับที่ตำแหน่ง X

โดยที่ X คือตำแหน่งอักขระของ "[" ตัวแรก

ฉันจะใส่วัตถุ json ที่มีอาร์เรย์ได้อย่างไร

คำตอบ:


151

บรรทัดคำสั่งของคุณควรมีข้อมูล-d / -แทรกอยู่ก่อนสตริงที่คุณต้องการส่งใน PUT และคุณต้องการตั้งค่า Content-Type และไม่ยอมรับ

curl -H 'Content-Type: application/json' -X PUT -d '[JSON]' \
     http://example.com/service

การใช้ข้อมูล JSON ที่แน่นอนจากคำถามบรรทัดคำสั่งแบบเต็มจะกลายเป็น:

curl -H 'Content-Type: application/json' -X PUT \
    -d '{"tags":["tag1","tag2"],
         "question":"Which band?",
         "answers":[{"id":"a0","answer":"Answer1"},
                    {"id":"a1","answer":"answer2"}]}' \
    http://example.com/service

หมายเหตุ: ข้อมูล JSON ถูกรวมไว้เพื่อความสามารถในการอ่านเท่านั้นไม่สามารถใช้กับcurlคำขอได้


4
-1 เนื่องจาก Content-Type (แทนที่จะเป็น Accept) เป็นส่วนหัวที่ควรตั้งค่าในกรณีนี้
Goran

4
สำหรับผู้ที่สงสัยว่า [JSON] เป็นเพียงตัวยึดสำหรับสตริง JSON อย่าเพิ่มวงเล็บเหลี่ยมพิเศษรอบสตริง JSON ของคุณ
Mihai Todor

93

แม้ว่าโพสต์ต้นฉบับจะมีปัญหาอื่น ๆ (เช่น "-d" ที่ขาดหายไป) แต่ข้อความแสดงข้อผิดพลาดนั้นมีลักษณะทั่วไปมากกว่า

curl: (3) [globbing] วงเล็บปีกกาที่ซ้อนกันไม่รองรับที่ตำแหน่ง X

เนื่องจากวงเล็บปีกกา {} และวงเล็บเหลี่ยม [] เป็นอักขระพิเศษในการม้วนงอ หากต้องการปิด globbing นี้ให้ใช้ตัวเลือก " -g "

ตัวอย่างเช่นการสืบค้นข้อมูลด้าน Solr ต่อไปนี้จะล้มเหลวหากไม่มี"-g" เพื่อปิด curl globbing : curl -g 'http://localhost:8983/solr/query?json.facet={x:{terms:"myfield"}}'


4
นี่เป็นวิธีแก้ปัญหาที่ถูกต้องสำหรับฉันโดยใช้การ-gทำงานตามที่คาดไว้ ขอบคุณ @Yonik
arjones

3
ความดีของฉันฉันได้ค้นหาวิธีแก้ปัญหา GraphQL curl ของฉันและสิ่งนี้ช่วยฉันได้ Awesomesauce
NetOperator Wibby

39

ควรกล่าวถึงว่าAcceptส่วนหัวจะบอกเซิร์ฟเวอร์เกี่ยวกับสิ่งที่เรากำลังยอมรับกลับมาในขณะที่ส่วนหัวที่เกี่ยวข้องในบริบทนี้คือContent-Type

ขอแนะนำให้ระบุContent-Typeเป็นapplication/jsonเมื่อส่ง JSON สำหรับ curl ไวยากรณ์คือ:

-H 'Content-Type: application/json'

ดังนั้นคำสั่ง curl ที่สมบูรณ์จะเป็น:

curl -H 'Content-Type: application/json' -H 'Accept: application/json' -X PUT -d '{"tags":["tag1","tag2"],"question":"Which band?","answers":[{"id":"a0","answer":"Answer1"},{"id":"a1","answer":"answer2"}]}' http://example.com/service`

2

ลองใช้อัญประกาศเดี่ยวแทนอัญประกาศคู่ร่วมกับ-g

สถานการณ์ต่อไปนี้ใช้ได้ผลสำหรับฉัน

curl -g -d '{"collection":[{"NumberOfParcels":1,"Weight":1,"Length":1,"Width":1,"Height":1}]}" -H "Accept: application/json" -H "Content-Type: application/json" --user test@testmail.com:123456 -X POST  https://yoururl.com

ด้วย

curl -g -d "{'collection':[{'NumberOfParcels':1,'Weight':1,'Length':1,'Width':1,'Height':1}]}" -H "Accept: application/json" -H "Content-Type: application/json" --user test@testmail.com:123456 -X POST  https://yoururl.com

สิ่งนี้แก้ไขข้อผิดพลาดคำสั่ง error curl ของฉันโดยเฉพาะ: ลำไส้ใหญ่ url ไม่ดีเป็นอักขระตัวแรก


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