วิธีการตรวจสอบว่าคำสั่งเช่น curl เสร็จสมบูรณ์โดยไม่มีข้อผิดพลาด?


24

ฉันใช้ curl เพื่ออัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ผ่านโพสต์ HTTP

curl -X POST -d@myfile.txt server-URL

"Upload successful"เมื่อฉันด้วยตนเองรันคำสั่งนี้ในบรรทัดคำสั่งฉันได้รับการตอบสนองจากเซิร์ฟเวอร์เช่น อย่างไรก็ตามถ้าฉันต้องการรันคำสั่ง curl นี้ผ่านสคริปต์ฉันจะทราบได้อย่างไรว่าคำขอ POST ของฉันสำเร็จหรือไม่

คำตอบ:


21

วิธีที่ง่ายที่สุดคือจัดเก็บการตอบกลับและเปรียบเทียบ:

$ response=$(curl -X POST -d@myfile.txt server-URL);
$ if [ "Upload successful" == "${response}" ]; then … fi;

ฉันยังไม่ได้ทดสอบ ไวยากรณ์อาจปิดอยู่ แต่นั่นเป็นความคิด ฉันแน่ใจว่ามีวิธีการที่ซับซ้อนกว่านี้เช่นการตรวจสอบรหัสออกของ curl หรือบางสิ่งบางอย่าง

ปรับปรุง

curlส่งคืนรหัสออกบางส่วน ฉันเดาว่าโพสต์ที่ล้มเหลวอาจส่งผล55 Failed sending network data.ให้คุณอาจตรวจสอบให้แน่ใจว่ารหัสออกเป็นศูนย์โดยเปรียบเทียบกับ$?( Expands to the exit status of the most recently executed foreground pipeline.):

$ curl -X POST -d@myfile.txt server-URL;
$ if [ 0 -eq $? ]; then … fi;

หรือหากคำสั่งของคุณค่อนข้างสั้นและคุณต้องการทำบางสิ่งเมื่อมันล้มเหลวคุณสามารถพึ่งพาโค้ดทางออกเป็นเงื่อนไขในคำสั่งเงื่อนไข:

$ if curl --fail -X POST -d@myfile.txt server-URL; then
    # …(success)
else
    # …(failure)
fi;

ฉันคิดว่ารูปแบบนี้มักเป็นที่นิยมแต่โดยส่วนตัวแล้วฉันคิดว่ามันอ่านง่ายกว่า


20

คุณอาจใช้curl's --failตัวเลือกได้แม้ว่าคุณควรทดสอบครั้งแรก

man curl

-f, --fail (HTTP) ล้มเหลวอย่างเงียบ ๆ (ไม่มีเอาต์พุตเลย) จากข้อผิดพลาดของเซิร์ฟเวอร์ ส่วนใหญ่จะทำเพื่อให้สคริปต์ ฯลฯ สามารถจัดการกับความพยายามที่ล้มเหลวได้ดีขึ้น ในกรณีปกติเมื่อเซิร์ฟเวอร์ HTTP ไม่สามารถส่งเอกสารได้จะส่งคืนเอกสาร HTML ที่ระบุเช่นนั้น (ซึ่งมักจะอธิบายสาเหตุและอื่น ๆ ) การตั้งค่าสถานะนี้จะป้องกันไม่ให้ขดออกและส่งกลับข้อผิดพลาด 22

          This method is not fail-safe and there are occasions where  non-
          successful  response  codes  will  slip through, especially when
          authentication is involved (response codes 401 and 407).

ด้วยวิธีนี้คุณสามารถทำได้:

args="-X POST -d@myfile.txt server-URL"
curl -f $args && echo "SUCCESS!" ||
    echo "OH NO!"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.