การส่งคำขอ POST ผ่าน curl มีปัญหาเกี่ยวกับเครื่องหมายคำพูดคู่


0

ดังนั้นในการส่งคำขอ POST ไปยังส่วนสำคัญ (github) คุณสามารถทำสิ่งนี้ตามที่เห็นใน https: //gist.github.com/caspyi ...

curl --user "user" -X POST --data '{"description":"Created via API","public":"true","files":{"file1.txt":{"content":"Demo"}}' https://api.github.com/gists

แต่ในตัวอย่างข้างต้นชื่อไฟล์และเนื้อหาของไฟล์นั้นมีรหัสฮาร์ดซึ่งเป็นส่วน .. file1.txt":{"content":"Demo"}..

ฉันกำลังแทนที่ส่วนด้านบนด้วยตัวแปรของฉัน $file":{"content":"$content"} แต่เริ่มต้นตัวแปรคำขอ json จะต้องอยู่ในเครื่องหมายคำพูดคู่ซึ่งฉันทำ

curl --user "user" -X POST --data "{\"description\":\"Created via API\",\"public\":\"true\",\"files\":{\"$file\":{\"content\":\"$content\"}}' https://api.github.com/gists

แต่สิ่งนี้ใช้ไม่ได้ฉันได้รับข้อผิดพลาด json

{
  "message": "Problems parsing JSON",
  "documentation_url": "https://developer.github.com/v3/gists/#create-a-gist"
}

แม้ว่าฉันจะแทนที่เครื่องหมายคำพูดคู่ที่หลบหนีทั้งหมดด้วย \' คำพูดเดียว

ไม่มีใครรู้วิธีรวมตัวแปรภายในคำขอ json นี้หรือไม่ btw: ฉันได้ใช้ส่วนหัวทั้งหมดเช่น

 -H "Content-Type: application/json; charset=UTF-8" 

และชุดค่าผสมจำนวนมากเพื่อตรวจสอบคำขอ แต่ไม่มีประโยชน์

UPDATE

นี่คือลักษณะของเนื้อหาทั้งหมด

function gist_controller(){
    content=$(cat $1)
    DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
    read -p "enter your password - " pass 
    public="false"
    gist_content=$(cat $1)
    curl --user "samserayo"  -H "Content-Type: application/json; charset=UTF-8" -X POST -d  "{ 'description': 'Created via API', 'public': 'true', 'files':{ ' '$1 ':{ 'content': '$gist_content'}}" https://api.github.com/gists
}

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

@ MichaelKjörlingขอบคุณตั้งค่าสถานะแล้ว แม้ว่าฉันคิดว่าคำขอ curl มีบางสิ่งที่เกี่ยวข้องกับการดูแลเซิร์ฟเวอร์
samayo

ปัญหาเกี่ยวกับเครื่องหมายคำพูดและการหลบหนีเป็นพื้นฐานที่สุดของปัญหาการเขียนโปรแกรมทั้งหมด (ข้อผิดพลาดทางไวยากรณ์) คำถามควรจะถูกโยกย้ายไปยัง SO
Alexander

คำตอบ:


0

คุณไม่แสดงค่าที่คุณตั้งไว้สำหรับ $ file หรือ $ content สิ่งเหล่านั้นขยายออกไปสู่อะไร? เป็นไปได้ว่าอย่างใดอย่างหนึ่งหรืออย่างอื่นหรือทั้งสองอย่างมีอักขระที่ JSON parser ไม่ชอบ เป็นไปได้มากที่สุดสิ่งที่อยู่ภายในค่าการขยายตัวของตัวแปรจะต้องหลบหนีหรือเข้ารหัสเพิ่มเติมก่อนที่จะส่งไปยังตัวแยกวิเคราะห์ JSON ผ่านทาง curl

คุณส่งออกตัวแปรสภาพแวดล้อมแล้วหรือยัง?

ลอง:

echo "$ file $ content";

เพื่อให้แน่ใจว่าพวกเขาพร้อมแล้วตามที่คุณคาดหวัง


ขออภัยปรับปรุงเนื้อหา
samayo

0

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

การหลบหนีของเชลล์นั้นยุ่งยากและบางครั้งก็ดูเหมือนเป็นไปไม่ได้ที่จะได้สิ่งที่คุณต้องการ จริงๆแล้วในกรณีเช่นนี้ฉันจะเขียนสคริปต์ Python เพื่อโทรหา curl โดยที่ฉันรู้ว่าเชลล์ไม่ได้ "ช่วย" ฉัน


ขออภัยปรับปรุงเนื้อหา ฉันใช้เปลือกทุบตี
samayo

-1

คุณต้องใส่สตริงทั้งหมดในเครื่องหมายคำพูดคู่ ". และคุณต้องหลีกเลี่ยงอัญประกาศภายในสตริง

ดังนั้นแทนที่จะ:

"{'คำอธิบาย': 'สร้างผ่าน API', 'สาธารณะ': 'จริง', 'ไฟล์': {'' $ 1 ': {' เนื้อหา ':' $ gist_content '}}"

คุณต้องการ:

"{\" คำอธิบาย \ ": \" สร้างผ่าน API \ ", \" สาธารณะ \ ": \" จริง \ ", \" ไฟล์ \ ": {\" $ 1 \ ": {\" เนื้อหา \ ": \" $ gist_content \ "}}}"

คุณควรทดสอบด้วย echo และตรวจสอบให้แน่ใจว่าสตริงนั้นถูกต้องอย่างแน่นอน


ไม่นี่เป็นสิ่งแรกที่ฉันทำก่อนที่จะบ้า มันไม่ทำงานเช่นนั้น ฉันมักจะได้รับข้อผิดพลาดตามที่กล่าวไว้ข้างต้น "message": "Problems parsing JSON",
samayo

@samayo วางข้อความตรงตามที่คุณส่ง อาจเป็น JSON ที่ถูกกฎหมายหรือไม่ก็ได้ (ให้แน่ใจว่าแต่ละคน { มีการจับคู่ }.)
David Schwartz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.