cURL ระงับร่างกายตอบสนอง


112

เป็นไปได้หรือไม่ที่จะสั่งให้ cURL ระงับผลลัพธ์ของการตอบสนอง

ในกรณีของฉันเนื้อหาตอบกลับเป็นเพจ HTML ซึ่งล้นบัฟเฟอร์ CLI ทำให้ยากต่อการค้นหาข้อมูลที่เกี่ยวข้อง ฉันต้องการตรวจสอบส่วนอื่น ๆ ของผลลัพธ์เช่นรหัสตอบกลับ HTTP ส่วนหัว ฯลฯ ทุกอย่างยกเว้น HTML จริง

คำตอบ:


118

คุณสามารถใช้-oสวิตช์และnullไฟล์หลอก:

Unix

curl -s -o /dev/null -v http://google.com

Windows

curl -s -o nul -v http://google.com

1
... ถ้าคุณใช้ Unix ;-) สำหรับ Windows คุณอาจต้องการใช้ nul นี่คือลิงค์ไปยังเอกสารบางที BaltoStar อาจรู้สึกอยากอ่านก่อนถามครั้งต่อไป ;-) curl.haxx.se/docs/manpage.html
Marged

3
ยินดี. แต่เป็น "nul" "null" จะสร้างไฟล์ที่มีชื่อนั้น
Marged

1
ในความเป็นจริงฉันได้อ่าน man page ก่อนที่จะโพสต์และลองใช้-s -o nulแต่ในเครื่อง windows ของฉัน curl -s -o nul -v http://{internal-host}/{internal-uri}แสดงผล html ทั้งหมดของหน้า - ฉันลองcurl -s -o nul -v http://google.comแล้วมันไม่ได้ผลตามที่คาดไว้ดังนั้นฉันจึงไม่เข้าใจว่าทำไมสิ่งนี้ถึงใช้ไม่ได้กับไซต์ภายในของฉัน
BaltoStar

-oระบุเอาต์พุต URL เดียวเท่านั้น: หากคุณมีหลาย URL ระบบจะทิ้ง URL แรกเท่านั้น :(
Simon Buchan

1
อาศัยแบบไม่พกพาNULและ/dev/null. การใช้-sIXGETเป็นตัวเลือกที่ดีกว่า IMO
binki

46

นี่คือวิธีระงับเอาต์พุตและส่วนหัว curl ทั้งหมดโดยมีตัวเลือกในการแสดงข้อผิดพลาดหากเกิดขึ้น มีประโยชน์สำหรับงาน cron หรือการทดสอบอัตโนมัติ

Unix

ในการระงับเอาต์พุตทั้งหมด:

curl --silent --output /dev/null http://example.com

หากต้องการระงับเอาต์พุต แต่ยังคงแสดงข้อผิดพลาดหากเกิดขึ้น:

curl --silent --output /dev/null --show-error --fail http://example.com

Windows

ในการระงับเอาต์พุตทั้งหมด:

curl --silent --output nul http://example.com

หากต้องการระงับเอาต์พุต แต่ยังคงแสดงข้อผิดพลาดหากเกิดขึ้น:

curl --silent --output nul --show-error --fail http://example.com

อธิบายพารามิเตอร์

--silentระงับสถิติการดาวน์โหลดที่อยู่ระหว่างดำเนินการ (แต่จะยังคงแสดงเอาต์พุต HTML)
--output /dev/nullซ่อนเอาต์พุตที่ประสบความสำเร็จ
--show-errorจะแสดงข้อผิดพลาดแม้ว่าsilentจะเปิดใช้งานโหมด
--failจะทำให้เกิดข้อผิดพลาดขึ้นหากการตอบสนอง HTTP เป็นรหัสข้อผิดพลาด (404, 500 เป็นต้น) แทนที่จะเป็นเพียง DNS / ข้อผิดพลาด TCP


UPDATE:ผมทราบดีว่าผู้เขียนต้นฉบับอยากจะตรวจสอบส่วนหัวและการตอบสนองของการร้องขอรหัสแทนที่จะห้ามไม่ให้พูดทุกอย่าง ดูคำตอบของ samaelสำหรับรายละเอียดเกี่ยวกับวิธีการทำ


2
อาศัยแบบไม่พกพาNULและ/dev/null. การใช้-sIXGETเป็นตัวเลือกที่ดีกว่า IMO
binki

1
ขอบคุณสำหรับความคิดเห็น @binki - พวกเขาทำสิ่งที่แตกต่างกันจริงๆ นอกจากนี้ยังตระหนักว่า OP ต้องการตรวจสอบส่วนหัวที่ไม่แสดงในโซลูชันของฉัน ฉันได้อัปเดตคำตอบเพื่อให้สอดคล้องกับสิ่งนั้นแล้ว
Simon East

1
ผมคิดว่าในการโพสต์ rereading OP ของพวกเขาไม่ได้บอกว่าพวกเขาเพียงต้องการที่จะเห็นส่วนหัว จริงๆแล้วพวกเขาอาจกำลังมองหาcurl -vo/dev/null/ curl -voNUL…และฉันไม่รู้ว่ามีตัวแปรแบบพกพาหรือเปล่าหือ… ;-)
binki

มีคำสั่งสั้น ๆ สำหรับ --fail หรือไม่? ฉันคิดว่า -sS คือสิ่งที่เราต้องการสำหรับทั้ง
--silent และ --show

ใช่มี: curl -Ssfo /dev/null url. แต่จะดีกับผู้ดูแลในอนาคต
Amit Naidu

29

เมื่อคุณต้องการแสดงส่วนหัว แต่ซ่อนเนื้อหาตอบกลับคุณจะต้องใช้:

curl -sIXGET http://somedomain.com/your/url

ฉันใช้curl -I http://somedomain.com/your/urlเพื่อแสดงส่วนหัวการตอบกลับ ปัญหาที่เกิดขึ้นคือมันทำให้คำขอโดยใช้HEADวิธีการซึ่งไม่ดีเมื่อคุณต้องการทดสอบการเรียก API ที่ตอบสนองต่อGETคำขอเท่านั้น นี่คือสิ่งที่-X GETมีไว้เพื่อเปลี่ยนคำขอเป็นไฟล์GETไฟล์.

โดยสรุป:

-sซ่อนแถบความคืบหน้าจากเอาต์พุต (มีประโยชน์อย่างยิ่งเมื่อส่งไปยังโปรแกรมอื่น)
-Iแสดงส่วนหัว (แต่HEADส่งคำขอ)
-XGETแปลงคำขอกลับเป็นGETคำขอ

ดู: http://www.woolie.co.uk/article/curl-full-get-request-dropping-body/


2
มันซับซ้อนมาก curl -iทำสิ่งเดียวกันทุกประการ
bfontaine

4
ไม่-iรวมส่วนหัว HTTP ในเอาต์พุตเช่นเดียวกับเนื้อหา ลองมัน. curl -i http://google.comไม่เหมือนกับcurl -IXGET http://google.com
samael

สำหรับวัตถุประสงค์ของฉัน (และ OP) curl -I urlนั้นเพียงพอและมีผลเช่นเดียวกัน ฉันแค่ต้องการตรวจสอบว่า url ตอบสนองหรือไม่ คำถามนี้ก็เช่นกันเกี่ยวกับการระงับร่างกายซึ่งHEADทำได้ดี
Amit Naidu

0

เพียงแค่ขอ HEAD คุณจะได้รับส่วนหัวโดยไม่มีร่างกาย เซิร์ฟเวอร์ที่เป็นไปตามมาตรฐานควรจะส่งข้อมูลเดียวกันกับที่นี่ทุกประการตามที่ส่งไปยังคำขอ GET

curl --head <url>

หากคำขอ HEAD ไม่ได้ผลสำหรับคุณด้วยเหตุผลบางประการสิ่งนี้จะทำให้ cURL รับและพิมพ์รหัสตอบกลับและส่วนหัวจากนั้นจึงหยุดการเชื่อมต่อโดยไม่ได้รับเนื้อหาตอบกลับซึ่งแตกต่างจากคำตอบอื่น ๆ ที่ได้รับแล้วทิ้งไป ซึ่งจะช่วยประหยัดเวลาและแบนด์วิดท์ได้มากโดยเฉพาะอย่างยิ่งหากตัวเครื่องมีขนาดใหญ่มาก

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