कर्ल का उपयोग करके HTTP POST से केवल प्रतिक्रिया हैडर प्राप्त करना


561

एक विकल्प के रूप में, केवल HTTP सिर का इस्तेमाल करते हेडर का अनुरोध कर सकते -Iमें curl(1)

$ curl -I /

लंबी एचटीएमएल प्रतिक्रिया निकायों को कमांड-लाइन में प्राप्त करने के लिए एक दर्द है, इसलिए मैं अपने POST अनुरोधों के फीडबैक के रूप में केवल हेडर प्राप्त करना चाहूंगा। हालाँकि, HEAD और POST दो अलग-अलग विधियाँ हैं।

मैं 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

इस प्रकार अनुप्रेषित करता है, हेडर को स्टडआउट करने के लिए डंप करता है और डेटा को / dev / null को भेजता है (यह एक GET है, एक POST नहीं है, लेकिन आप POST के साथ एक ही काम कर सकते हैं - बस जो भी विकल्प आप पहले से ही POSTing डेटा के लिए उपयोग कर रहे हैं उसे जोड़ दें)

ध्यान दें कि -जिसके बाद -Dसंकेत मिलता है कि आउटपुट "फ़ाइल" stdout है।


22
यदि आप शक्तियां उपयोग कर रहे हैं तो उपरोक्त टिप्पणी मान्य है। cmd.exe उपयोग के लिएcurl -s -D - http://yahoo.com -o nul
JJS

1
@JJS मेरे लिए $ n ने Win7 पर काम किया। क्या यह विंडोज़ पर स्थापित सीलिंक के कारण है।
सत्य प्रकाश 15

17
URL के सामने "-" महत्वहीन लग सकता है, लेकिन यह नहीं है।
वाहिद सादिक

1
@AhidSadik विशेष रूप से मामला ऐसा क्यों है? एकल डैश का क्या कार्य है?
ममाचंको

4
@ ममाचांको -Dतर्क देता है कि आउटपुट कहां जाना चाहिए। एकल पानी का छींटा इसका मतलब है कि इसे stdout में जाना चाहिए।
andrew cooke

172

अन्य उत्तरों के लिए प्रतिक्रिया निकाय को डाउनलोड करने की आवश्यकता होती है। लेकिन POST अनुरोध करने का एक तरीका है जो केवल हेडर प्राप्त करेगा:

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

एक -Iअपने आप में एक HEAD अनुरोध है जिसके द्वारा अधिरोहित जा सकता है प्रदर्शन करती -X POSTएक पोस्ट (या किसी अन्य) अनुरोध करने के लिए और अभी भी केवल शीर्ष लेख डेटा मिलता है।


15
यह उत्तर वास्तव में सही है क्योंकि वेब सर्वर अनुरोध विधि के आधार पर विभिन्न शीर्ष लेख लौटा सकते हैं। यदि आप GET पर हेडर चेक करना चाहते हैं, तो आपको GET रिक्वेस्ट का उपयोग करना होगा।
छन्नीलाल

6
मेरी राय में, यह सबसे सही उत्तर है। यह याद रखना आसान है, यह वास्तव में GETअनुरोध भेजता है और पूरे प्रतिक्रिया निकाय को डाउनलोड नहीं करता है (या कम से कम इसे आउटपुट नहीं करता है)। -sझंडा था और न आवश्यक है।
स्कॉकिन

@JeffPuckettII अच्छी तरह से थोड़े nitpicking मैं कहूंगा। आप बदल सकते हैं GETके साथ POSTउपरोक्त आदेश में और यह उम्मीद के रूप में काम करेंगे। or any otherवहाँ कुंजी है।
छांत्याल

18
यह तब काम नहीं करता है जब आप वास्तव में POSTकुछ डेटा चाहते हैं । कर्ल कहते हैं:Warning: You can only select one HTTP request method! You asked for both POST Warning: (-d, --data) and HEAD (-I, --head).
सेबस्टियनएच

2
@nickboldt यहाँ बिंदु यह है कि एक सर्वर POST या GET अनुरोध (और कुछ सर्वर वास्तव में ऐसा करते हैं) की तुलना में एक HEAD अनुरोध के लिए अलग तरह से प्रतिक्रिया दे सकता है, इसलिए -X HEADयहाँ कोई विश्वसनीय समाधान नहीं है।
सिराकुसा

58

निम्न आदेश अतिरिक्त सूचना प्रदर्शित करता है

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

आप सर्वर से केवल पूर्ण प्रतिक्रिया के बजाय HEAD भेजने के लिए कह सकते हैं

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

Note:कुछ मामलों में, सर्वर पोस्ट और HEAD के लिए अलग हेडर भेज सकता है। लेकिन लगभग सभी मामलों में हेडर एक जैसे होते हैं।


5
यह दुर्भाग्यपूर्ण है कि अन्य उत्तर जीता, क्योंकि यह सही उत्तर है - यह अनावश्यक रूप से एक टन डेटा स्थानांतरित नहीं करता है।
डैनियल

1
@ डीडीएम अगर मैं -X, --requestसही तरीके से CURL मैनुअल को समझता हूं , तब -X HEADभी "डेटा का एक टन" होता है, लेकिन -I, --headजो आप अनुमान लगा रहे हैं उसमें परिणाम होना चाहिए।
डैनियल एआर वर्नर

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.
डोरियन

53

लंबी प्रतिक्रिया निकायों (और विभिन्न अन्य समान स्थितियों) के लिए, मेरे द्वारा उपयोग किया जाने वाला समाधान हमेशा पाइप करने के लिए होता है less, इसलिए

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

या

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

नौकरी करेंगे।


ये समतुल्य नहीं हैं । पहला HEADअनुरोध एक अनुरोध जारी करता है जिसके लिए कई सर्वर अलग-अलग प्रतिक्रिया देते हैं। दूसरा GETअनुरोध एक अनुरोध है जो अधिक है जैसे हम यहां खोज रहे हैं।
glasz 16

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संक्षिप्तता के लिए किया जाता है
एक्सबुक करें

इसका एक ही व्यवहार नहीं है, इसलिए इसका उपयोग केवल 8 वर्णों को बचाने के लिए करना अजीब है।
bfontaine

2
@ बफोंटेन अन्य उत्तर हैं जो बताते हैं कि यह सबसे सही तरीके से कैसे किया जाता है, यह एक छोटा विकल्प दिखाने के लिए यहां है जो मूल रूप से एक ही काम करता है।
एक्सबुक

आपको अपने उत्तर में स्पष्ट करना चाहिए कि यह आदेश हमेशा विफल रहता है। 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 डालना था।
क्रिस्टोफ वीस

1
यह आवश्यक है या नहीं यह url और प्रयुक्त शेल पर निर्भर हो सकता है। मैंने उसी हिसाब से जवाब में सुधार किया। धन्यवाद।
डैनियल एआर वर्नर

3

headcurl.cmd (विंडोज़ संस्करण)

curl -sSkv -o NUL %* 2>&1
  • मुझे एक प्रगति पट्टी नहीं चाहिए -s,
  • लेकिन मुझे त्रुटियाँ चाहिए -S,
  • मान्य https प्रमाणपत्रों के बारे में परेशान नहीं -k,
  • उच्च वाचालता प्राप्त करना -v(यह समस्या निवारण के बारे में है, यह है?)
  • कोई आउटपुट नहीं (साफ तरीके से)।
  • ओह, और मैं चाहता हूँ आगे stderr करने के लिए stdout , तो मैं पूरी बात के खिलाफ grep कर सकते हैं (के बाद से अधिकांश या सभी उत्पादन stderr में आता है)
  • %*इसका मतलब है [इस स्क्रिप्ट के लिए सभी मापदंडों पर पास] (अच्छी तरह से ( https://stackoverflow.com/a/980372/444255 ), आमतौर पर यह सिर्फ एक पैरामीटर है: आपके द्वारा परीक्षण किया जा रहा यूआरएल

वास्तविक दुनिया का उदाहरण (प्रॉक्सी समस्याओं के निवारण पर):

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

लिनक्स संस्करण

आपके .bash_aliases/ .bash_rc: के लिए

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

यह शरीर को डाउनलोड करेगा और बैंडविड्थ, समय का उपभोग करेगा। @ सिराकुसा का जवाब ( stackoverflow.com/a/38679650/6168139 ) इस ओवरहेड नहीं है।
ऋषि

यदि और जब आप POST चाहते हैं -X POST, तो passthrough पैरामीटर में जोड़ें , यदि आप GET चाहते हैं, तो GET (यानी डिफ़ॉल्ट) का उपयोग करें, क्योंकि प्रतिक्रियाएं भिन्न हो सकती हैं। - जब तक आप उत्पादन लिपियों में भारी कर्लिंग नहीं करते (निदान और विकास के लिए नहीं) मैं थोड़ी सी भी बैंडविड्थ की परवाह नहीं करता।
फ्रैंक नॉक

मैं यह देखने के लिए योजना बना रहा हूं कि क्या सर्वर पर फाइलें अपडेट की गई हैं या 'अंतिम-संशोधित' का उपयोग नहीं कर रही हैं। अपने आप में फ़ाइलें बड़ी हैं, कुछ जीबी में हैं, और मैं आमतौर पर सेलुलर इंटरनेट पर हूं। तो, यह बड़ी बैंडविड्थ मेरे लिए एक मुद्दा है।
rushi

यह हैक किया जाएगा । मुझे यह करने की आवश्यकता नहीं है क्योंकि सिराकुसा का उत्तर कार्य को सही ढंग से करता है।
रूशी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.