รับส่วนหัวคำตอบเดียวจาก HTTP POST โดยใช้ curl


561

หนึ่งสามารถขอเพียงส่วนหัวโดยใช้หัว HTTP, เป็นตัวเลือกใน-Icurl(1)

$ curl -I /

เนื้อความการตอบสนอง HTML ที่มีความยาวเป็นสิ่งที่เจ็บปวดในการรับบรรทัดคำสั่งดังนั้นฉันจึงต้องการรับเฉพาะส่วนหัวเป็นคำติชมสำหรับคำขอ POST ของฉัน อย่างไรก็ตาม HEAD และ POST เป็นสองวิธีที่ต่างกัน

ฉันจะให้ curl แสดงเฉพาะส่วนหัวการตอบสนองต่อคำขอ POST ได้อย่างไร

คำตอบ:


773
-D, --dump-header <file>
       Write the protocol headers to the specified file.

       This  option  is handy to use when you want to store the headers
       that a HTTP site sends to you. Cookies from  the  headers  could
       then  be  read  in  a  second  curl  invocation by using the -b,
       --cookie option! The -c, --cookie-jar option is however a better
       way to store cookies.

และ

-S, --show-error
       When used with -s, --silent, it makes curl show an error message if it fails.

และ

-L/--location
      (HTTP/HTTPS) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response
      code), this option will make curl redo the request on the new place. If used together with -i/--include or -I/--head, headers from  all  requested
      pages  will  be  shown.  When authentication is used, curl only sends its credentials to the initial host. If a redirect takes curl to a different
      host, it won’t be able to intercept the user+password. See also --location-trusted on how to change this. You can limit the amount of redirects to
      follow by using the --max-redirs option.

      When curl follows a redirect and the request is not a plain GET (for example POST or PUT), it will do the following request with a GET if the HTTP
      response was 301, 302, or 303. If the response code was any other 3xx code, curl will re-send the following  request  using  the  same  unmodified
      method.

จากหน้าคน ดังนั้น

curl -sSL -D - www.acooke.org -o /dev/null

ติดตามการเปลี่ยนเส้นทางทิ้งส่วนหัวไปที่ stdout และส่งข้อมูลไปยัง / dev / null (นั่นคือ GET ไม่ใช่ POST แต่คุณสามารถทำสิ่งเดียวกันกับ POST - เพียงเพิ่มตัวเลือกที่คุณใช้สำหรับ POSTing data อยู่แล้ว)

สังเกต-หลัง-Dซึ่งระบุว่าเอาต์พุต "file" คือ stdout


22
ความคิดเห็นด้านบนมีผลบังคับใช้หากคุณใช้ PowerShell สำหรับการใช้งาน cmd.execurl -s -D - http://yahoo.com -o nul
JJS

1
@JJS สำหรับฉัน $ null ทำงานบน Win7 เป็นเพราะ cLink ติดตั้งบน windows
Satya Prakash

17
"-" ด้านหน้า URL อาจดูเหมือนไม่สำคัญ แต่ไม่ใช่
Wahid Sadik

1
@WahidSadik ทำไมเป็นเช่นนั้นโดยเฉพาะ? ฟังก์ชั่นของเส้นประเดียวคืออะไร?
mamachanko

4
@mamachanko -Dรับอาร์กิวเมนต์ที่ระบุว่าเอาต์พุตควรไปที่ใด เครื่องหมายขีดกลางเดียวหมายความว่าควรไปที่ stdout
andrew cooke

172

คำตอบอื่น ๆ จะต้องดาวน์โหลดเนื้อหาการตอบกลับ แต่มีวิธีสร้างคำขอ POST ที่จะดึงเฉพาะส่วนหัวได้:

curl -s -I -X POST http://www.google.com

-Iด้วยตัวเองดำเนินการคำขอ HEAD ซึ่งสามารถแทนที่โดย-X POSTการดำเนินการ POST (หรืออื่น ๆ ) แจ้งความประสงค์และยังคงได้รับเฉพาะข้อมูลส่วนหัว


15
คำตอบนี้ถูกต้องจริงเพราะเว็บเซิร์ฟเวอร์สามารถคืนส่วนหัวที่แตกต่างกันตามวิธีการร้องขอ หากคุณต้องการตรวจสอบส่วนหัวบน GET คุณต้องใช้คำขอ GET
chhantyal

6
นี่เป็นคำตอบที่ถูกต้องที่สุดในความคิดของฉัน จำได้ง่ายมันส่งGETคำขอจริงและไม่ดาวน์โหลดเนื้อหาตอบกลับทั้งหมด (หรืออย่างน้อยก็ไม่ส่งออก) -sธงมิได้จำเป็น
skozin

@JeffPuckettII ดีครับ nitpicking ฉันอยากจะบอกว่า คุณสามารถแทนที่GETด้วยPOSTคำสั่งในข้างต้นและมันจะทำงานตามที่คาดไว้ or any otherเป็นกุญแจสำคัญ
chhantyal

18
สิ่งนี้ไม่ทำงานเมื่อคุณต้องการPOSTข้อมูลบางอย่าง Curl พูดว่า:Warning: You can only select one HTTP request method! You asked for both POST Warning: (-d, --data) and HEAD (-I, --head).
SebastianH

2
@nickboldt จุดที่นี่คือเซิร์ฟเวอร์อาจตอบสนองต่อคำขอ HEAD ที่แตกต่างจากคำขอ POST หรือ GET (และเซิร์ฟเวอร์บางตัวทำเช่นนั้น) ดังนั้นจึง-X HEADไม่มีโซลูชันที่เชื่อถือได้ที่นี่
siracusa

58

คำสั่งต่อไปนี้แสดงข้อมูลเพิ่มเติม

curl -X POST http://httpbin.org/post -v > /dev/null

คุณสามารถขอให้เซิร์ฟเวอร์ส่งเฉพาะ HEAD แทนที่จะตอบเต็ม

curl -X HEAD -I http://httpbin.org/

Note:ในบางกรณีเซิร์ฟเวอร์อาจส่งส่วนหัวที่แตกต่างกันสำหรับการโพสต์และหัว แต่ในเกือบทุกกรณีส่วนหัวเหมือนกัน


5
โชคไม่ดีที่คำตอบอื่นชนะเพราะนี่เป็นคำตอบที่ถูกต้อง - ไม่จำเป็นต้องถ่ายโอนข้อมูลเป็นจำนวนมากโดยไม่จำเป็น
แดเนียล

1
@dmd หากฉันเข้าใจคู่มือ cURL -X, --requestอย่างถูกต้อง-X HEADยังคงส่งผลให้ "ข้อมูลเป็นตัน" แต่มี-I, --headสิ่งใดบ้างที่ควรเป็นผลลัพธ์ในสิ่งที่คุณคาดหวัง
Daniel AR Werner

1
คุณไม่เข้าใจอย่างถูกต้อง -X HEADและ-Iเทียบเท่า
แดเนียล

18
ปัญหาเกี่ยวกับการ-X HEADเป็นที่เซิร์ฟเวอร์อาจตอบสนองแตกต่างเนื่องจากขณะนี้ได้รับHEADการร้องขอแทนGET(หรือสิ่งที่ร้องขอก่อนหน้านี้)
Grav

4
Warning: Setting custom HTTP method to HEAD with -X/--request may not work the Warning: way you want. Consider using -I/--head instead.
Dorian

53

เพราะร่างการตอบสนองยาว (และสถานการณ์ที่คล้ายกันอื่น ๆ ) การใช้วิธีการแก้ปัญหาผมอยู่เสมอที่จะท่อlessเพื่อให้

curl -i https://api.github.com/users | less

หรือ

curl -s -D - https://api.github.com/users | less

จะทำงาน


สิ่งเหล่านี้ไม่เทียบเท่า ประเด็นแรกคือการHEADร้องขอที่เซิร์ฟเวอร์หลายแห่งตอบสนองแตกต่างกัน ประเด็นที่สองคือGETคำขอที่เหมือนกับสิ่งที่เรากำลังมองหาที่นี่
glasz

25

บางทีมันอาจจะดูรุนแรงไปหน่อย แต่ฉันใช้เวอร์ชั่นสั้นนี้:

curl -svo. <URL>

คำอธิบาย:

-v พิมพ์ข้อมูลการแก้ไขข้อบกพร่อง (ซึ่งรวมถึงส่วนหัว)

-o.ส่งข้อมูลหน้าเว็บ (ซึ่งเราต้องการละเว้น) ไปยังไฟล์บางไฟล์.ในกรณีนี้ซึ่งเป็นไดเรกทอรีและเป็นปลายทางที่ไม่ถูกต้องและทำให้การส่งออกถูกละเว้น

-sไม่มีแถบความคืบหน้าไม่มีข้อมูลข้อผิดพลาด (มิฉะนั้นคุณจะเห็นWarning: Failed to create the file .: Is a directory)

คำเตือน:ผลลัพธ์ล้มเหลวเสมอ (ในแง่ของรหัสข้อผิดพลาดหากสามารถเข้าถึงได้หรือไม่) ห้ามใช้ในพูดคำสั่งแบบมีเงื่อนไขในเชลล์สคริปต์ ...


1
ทำไมต้องใช้-o.แทน-o /dev/null?
bfontaine

@bfontaine -o.ใช้กับ-o /dev/nullความกะทัดรัด
exebook

มันไม่ได้มีพฤติกรรมเหมือนกันดังนั้นจึงเป็นเรื่องแปลกที่จะใช้เพื่อบันทึก 8 ตัวอักษรเท่านั้น
bfontaine

2
@ bfontaine มีคำตอบอื่น ๆ ที่แสดงวิธีการทำวิธีที่ถูกต้องมากที่สุดอันนี้อยู่ที่นี่เพื่อแสดงทางเลือกสั้น ๆ ที่ทำสิ่งเดียวกันโดยทั่วไป
exebook

คุณควรชี้แจงในคำตอบของคุณว่าคำสั่งนี้ล้มเหลวเสมอ curl -svo. <url> && echo fooจะไม่พิมพ์fooเพราะ-o.ทำให้curlกลับ (ข้อผิดพลาด =) curl: (23) Failed writing bodyรหัสไม่ใช่ศูนย์:
bfontaine


14

ในขณะที่คำตอบอื่น ๆ ไม่ได้ผลสำหรับฉันในทุกสถานการณ์ทางออกที่ดีที่สุดที่ฉันสามารถหาได้ (ทำงานด้วยPOSTเช่นกัน) นำมาจากที่นี่ :

curl -vs 'https://some-site.com' 1> /dev/null


1
ฉันต้องใส่ url ไว้ระหว่างเครื่องหมายอัญประกาศเพื่อให้ได้ผล
Christophe Weis

1
สิ่งนี้จำเป็นหรือไม่ขึ้นอยู่กับ url และเชลล์ที่ใช้ ฉันปรับปรุงคำตอบให้ดีขึ้น ขอบคุณ
Daniel AR Werner

3

headcurl.cmd (รุ่น windows)

curl -sSkv -o NUL %* 2>&1
  • ฉันไม่ต้องการแถบความคืบหน้า-s,
  • แต่ฉันทำข้อผิดพลาดลง-S,
  • ไม่รบกวนเกี่ยวกับใบรับรอง https ที่ถูกต้อง-k,
  • รับ verbosity สูง-v(นี่คือเกี่ยวกับการแก้ไขปัญหามันคืออะไร)
  • ไม่มีเอาต์พุต (ในวิธีที่สะอาด)
  • โอ้และฉันต้องการส่งต่อstderrไปยังstdoutดังนั้นฉันจึงสามารถ grep กับทุกสิ่ง (เนื่องจากเอาต์พุตส่วนใหญ่หรือทั้งหมดมาใน stderr)
  • %*หมายถึง [ส่งผ่านพารามิเตอร์ทั้งหมดไปยังสคริปต์นี้] (ดี ( https://stackoverflow.com/a/980372/444255 ) โดยปกติแล้วนั่นเป็นเพียงพารามิเตอร์เดียว: URL ที่คุณกำลังทดสอบ

ตัวอย่างโลกแห่งความจริง (ในการแก้ไขปัญหาพร็อกซี):

C:\depot>headcurl google.ch | grep -i -e http -e cache
Hostname was NOT found in DNS cache
GET HTTP://google.ch/ HTTP/1.1
HTTP/1.1 301 Moved Permanently
Location: http://www.google.ch/
Cache-Control: public, max-age=2592000
X-Cache: HIT from company.somewhere.ch
X-Cache-Lookup: HIT from company.somewhere.ch:1234

รุ่น Linux

สำหรับคุณ.bash_aliases/ .bash_rc:

alias headcurl='curl -sSkv -o /dev/null $@  2>&1'

สิ่งนี้จะดาวน์โหลดเนื้อความและใช้แบนด์วิดท์เวลา @siracusa คำตอบ ( stackoverflow.com/a/38679650/6168139 ) ไม่มีค่าใช้จ่ายนี้
rushi

หาก & เมื่อคุณต้องการ POST ให้เพิ่ม-X POSTพารามิเตอร์ passthrough หากคุณต้องการ GET ให้ใช้ GET (เช่นค่าเริ่มต้น) เนื่องจากการตอบสนองอาจแตกต่างกัน - ถ้าคุณไม่ทำสคริปต์การผลิตจำนวนมาก (ไม่ใช่สำหรับการวินิจฉัยและการพัฒนา) ฉันไม่สนใจแบนด์วิธสักหน่อย
Frank Nocke

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

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