HTTP स्थिति कोड आउटपुट करने के लिए कर्ल हो रहा है?


797

मैं curlHTTP अनुरोध जारी करने के लिए लिनक्स पर कमांड लाइन का उपयोग कर रहा हूं । प्रतिक्रिया निकायों को मानक से बाहर मुद्रित किया जाता है, जो ठीक है, लेकिन मैं मैन पेज से नहीं देख सकता कि कैसे प्रतिक्रिया (404, 403 आदि) से HTTP स्थिति कोड को प्रिंट करने के लिए कर्ल प्राप्त करें। क्या यह संभव है?


मेरे लिए, मैं HTTP स्टेटस कोड प्राप्त करने के लिए मैनुअल से देख सकता हूं, लेकिन विकल्प -w काम नहीं करता है। मैंने बग को Apple को रिपोर्ट किया है।
निकोलस बारबुल्स्को

19
-iझंडा, के रूप में curl -i https://www.example.com/, संभव है कि आप के अनुसार चाहते हैं, है superuser.com/a/514798/190188
कांव-कांव

सिर्फ कुछ ऐसा क्यों नहीं curl -IL http://www.example.com | grep "^HTTP\/"?
St3an

भविष्य के लिए नहीं: आप जो उत्तर चाहते हैं, वह शायद सिरिल डेविड का है (वर्तमान में 4 वें स्थान पर है)
व्हाइटहोटलवेट टाइगर

जवाबों:


525

यह आपके लिए काम करना चाहिए यदि वेब सर्वर HEAD अनुरोधों का जवाब देने में सक्षम है (यह प्रदर्शन नहीं करेगा GET):

curl -I http://www.example.org

इसके अलावा, CURL को पुनर्निर्देश (3xx स्टेटस) ऐड -L का पालन करने दें।


154
NB: curl -Iएक HEAD HTTP अनुरोध करता है, जो कुछ वेब एप्लिकेशन सर्वर और सेवाओं के लिए HTTP स्थिति कोड के परीक्षण के लिए समस्याग्रस्त हो सकता है
Jay Taylor

16
और बस स्टेटस संख्या प्राप्त करने के लिए, इसे पाइप करेंhead -n 1|cut -d$' ' -f2
बेनुबर्ड

33
कर्ल के स्टाडर को पुनर्निर्देशित करना न भूलें curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2:। यदि आपको पुनर्निर्देशन के बाद अंतिम स्थिति की आवश्यकता है तो कर्ल में जोड़ें -L करें।
आरोन ब्लेनकुश

1
केवल एक HEAD अनुरोध करने के बाद पुनर्निर्देशित करने के बाद एप्लिकेशन को कैसे प्रोग्राम किया जाता है, इसके आधार पर दिलचस्प व्यवहार हो सकता है।
स्कॉट मैकइंटायर

31
curl -I -X GETGET अनुरोध भेजेगा, लेकिन वही आउटपुट देगा।
जिग्गी

835

सिर्फ HTTP स्टेटस कोड को प्रिंट करने का एक और अधिक विशिष्ट तरीका है :

curl -s -o /dev/null -w "%{http_code}" http://www.example.org/

स्क्रिप्ट में काम करने के लिए बहुत आसान है, क्योंकि इसके लिए किसी पार्सिंग की आवश्यकता नहीं है :-)

-Iप्रतिक्रिया लोड प्रदर्शन को बेहतर बनाने के लिए पैरामीटर जोड़ा जा सकता है। यह पैरामीटर केवल स्थिति के लिए अनुरोध करता है / प्रतिक्रिया के हेडर, डाउनलोड प्रतिक्रिया निकाय के बिना।

नोट: %{http_code} HTTP पेलोड की पहली पंक्ति पर रिटर्न

अर्थात:

curl -s -o /dev/null -I -w "%{http_code}" http://www.example.org/

54
-w "% {http_code}" वह बिट है जो स्टेटस कोड प्रिंट करता है। आप शरीर से कोड (-w "\ n \ n% {http_code} \ n") को अलग करने के लिए एक नई या दो जोड़ सकते हैं
जेफरी मार्टिनेज़

7
वाह, यह /dev/nullबात भी कर्ल के विंडोज संस्करण में काम करती है जो मैं उपयोग कर रहा हूं।
उवे कीम

3
मेरा मानना ​​है कि यह पूरी फ़ाइल को डाउनलोड करता है, भले ही यह सभी / dev / null में जाता है, इसलिए बड़ी फ़ाइलों के लिए स्थिति कोड की जाँच करने के लिए आदर्श नहीं है। httping -c 1 -s -G -mएक GET जारी करता है और पूरी फ़ाइल डाउनलोड नहीं करता है, हालांकि मुझे एहसास है कि यह सवाल विशेष रूप से कर्ल के बारे में है।
रोमनस्टॉक

40
FYI करें: -s= डाउनलोड प्रगति न दिखाएं, -o /dev/null= शरीर प्रदर्शित न करें, -w "%{http_code}"= बाहर निकलने के बाद stdout में http प्रतिक्रिया कोड लिखें।
Ajedi32

1
क्या "% {http_code}" के आसपास के उद्धरण आवश्यक हैं?
हकन बाबा

216

यदि आप शीर्ष लेख के साथ-साथ परिणाम देखना चाहते हैं तो आप क्रिया विकल्प का उपयोग कर सकते हैं:

curl -v http://www.example.org
curl --verbose http://www.example.org

हेडर में स्थिति दिखाई देगी। उदाहरण के लिए

< Date: Tue, 04 Nov 2014 19:12:59 GMT
< Content-Type: application/json; charset=utf-8
< Status: 422 Unprocessable Entity

26
+1 क्रिया झंडे को इंगित करने के लिए अतिरिक्त विवरण प्रदान करता है। REST ऐप्स के परीक्षण के लिए बढ़िया है।
MrOodles

8
POST अनुरोध (कर्ल -v - दाता "...") करते समय +1 का उपयोग करना बहुत आसान है
MegaTux

1
यह उन्हें दो अलग-अलग फ़ाइल आउटपुट में विभाजित करता है (stdout के लिए stderr और प्रतिक्रिया बॉडी के लिए http स्थिति विवरण)
Blauhirn

201

आप निम्न करके सभी हेडर के अलावा स्टेटस कोड प्रिंट कर सकते हैं:

curl -i http://example.org

अच्छी बात -iयह है कि यह साथ -X POSTही साथ काम करता है ।


36
स्वीकृत उत्तर (जो HEAD अनुरोध करता है) से बहुत बेहतर है।
neu242

10
शायद स्पष्ट है, लेकिन किसी भी HTTP विधि के -iसाथ काम करता है , न कि सिर्फ और सिर्फ ... :)GETPOST
mac

3
इसका सबसे अच्छा उत्तर क्योंकि यह हेडर और बॉडी दोनों के कर्ल आउटपुट को बनाता है, जब यह स्क्रिप्ट में उपयोग किए जाने वाले अधिकांश कार्यों के लिए उपयुक्त होता है
सर्ज बोर्स्च

6
यह सबसे अच्छा उत्तर है, और इसे -s(प्रगति मीटर या त्रुटि संदेश न दिखाएं) के साथ संयोजन के रूप में इस्तेमाल किया जा सकता है और -S(सभी के बाद त्रुटि संदेश दिखाएं)
जोनाथन हार्टले

69

यदि आप एक चर में HTTP स्थिति कोड को कैप्चर करना चाहते हैं, लेकिन फिर भी STDOUT की सामग्री को पुनर्निर्देशित करते हैं, तो आपको दो STDOUTs बनाने होंगे। आप प्रक्रिया प्रतिस्थापन> () और कमांड प्रतिस्थापन $ () के साथ ऐसा कर सकते हैं ।

सबसे पहले, 3अपनी वर्तमान प्रक्रिया 'STDOUT' के लिए एक फाइल डिस्क्रिप्टर बनाएं exec 3>&1

फिर, -oकमांड प्रतिस्थापन का उपयोग करके एक अस्थायी फ़ेनो के लिए प्रतिक्रिया सामग्री को पुनर्निर्देशित करने के लिए कर्ल के विकल्प का उपयोग करें, और फिर उस कमांड प्रतिस्थापन के भीतर, अपनी वर्तमान प्रक्रिया STDOUT फाइल डिस्क्रिप्टर के 3साथ वापस आउटपुट भेजें -o >(cat >&3)

यह सब एक साथ रखना bash 3.2.57(1)-release(मानक के लिए macOS):

# creates a new file descriptor 3 that redirects to 1 (STDOUT)
exec 3>&1 
# Run curl in a separate command, capturing output of -w "%{http_code}" into HTTP_STATUS
# and sending the content to this command's STDOUT with -o >(cat >&3)
HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.com')

ध्यान दें कि यह नीचे दिए गए टिप्पणियों में दिए गए SamK के/bin/sh रूप में काम नहीं करता है ।


5
यह गंभीर चंचलता है ... और मुझे यह पसंद है!
स्पाइल

3
अब कैसे, बदले में, मैं आउटपुट को दूसरे चर पर पुनर्निर्देशित कर सकता हूं?
रोजर फिल्मीर

1
आउटपुट अंदर है STDOUT, इसलिए आपको कमांड से रीडायरेक्ट आउटपुट को कहीं भी ले जाना चाहिए, जैसे कि आप एक रेगुलर कमांड की तरह। हालांकि मैंने इसका परीक्षण नहीं किया है।
हीथ बॉर्डर्स

1
/ बिन / श के साथ काम नहीं करता है।
सैम

अच्छा जवाब, आप किसी वास्तविक फ़ाइल को रीडायरेक्ट भी कर सकते हैं और बाद में उसे खोल सकते हैं यदि आप गोले की पोर्टेबिलिटी चाहते हैं
akostadinov



11

यह एक दर्दनाक curl --failसीमा है। से man curl:

-f, --fail (HTTP) सर्वर त्रुटियों पर चुपचाप (सभी में कोई आउटपुट नहीं) विफल

लेकिन दोनों गैर-शून्य रिटर्न कोड और प्रतिक्रिया निकाय को प्राप्त करने का कोई तरीका नहीं है ।

Pvandenberk के उत्तर और SO पर सीखी गई यह अन्य बहुत ही उपयोगी चाल के आधार पर , यहाँ एक समाधान है:

curl_with_error_code () {
    _curl_with_error_code "$@" | sed '$d'
}
_curl_with_error_code () {
    local curl_error_code http_code
    exec 17>&1
    http_code=$(curl --write-out '\n%{http_code}\n' "$@" | tee /dev/fd/17 | tail -n 1)
    curl_error_code=$?
    exec 17>&-
    if [ $curl_error_code -ne 0 ]; then
        return $curl_error_code
    fi
    if [ $http_code -ge 400 ] && [ $http_code -lt 600 ]; then
        echo "HTTP $http_code" >&2
        return 127
    fi
}

यह फ़ंक्शन बिल्कुल वैसे ही व्यवहार करता है curl, लेकिन curlसीमा [400, 600] में एक HTTP कोड के मामले में 127 (एक गैर-उपयोग किए जाने वाला रिटर्न कोड ) लौटाएगा ।


सहमत, त्रुटि आउटपुट को देखने में सक्षम नहीं होना अन्यथा बहुत ही आसान - असफल होने की एक दर्दनाक सीमा है। आप त्रुटि आउटपुट को देखे बिना REST एपि विफलता का निदान कैसे कर सकते हैं? यह बहुत दुर्भाग्यपूर्ण है कि कर्ल मेंटेनर का बैग हठीली -फील-बट-शो-एरर प्रदान नहीं करने पर जोर देता है। github.com/curl/curl/issues/1978
jamshid

जैसा कि दस्तावेज़ीकरण में कहा गया है, यह 401 और 407 HTTP कोड के लिए काम नहीं करता है :(
लोगान मेज़

11

यह url के लिए एक अनुरोध भेजेगा, प्रतिक्रिया की केवल पहली पंक्ति प्राप्त करेगा, इसे ब्लॉकों पर विभाजित करें और दूसरे का चयन करें।

इसमें प्रतिक्रिया कोड होता है

curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2

1
क्या आप बता सकते हैं कि यह कोड क्या करता है और यह ओपी द्वारा दी गई समस्या को कैसे संबोधित करता है? अस्पष्टीकृत कोड उपयोगकर्ताओं के लिए अविश्वसनीय और खतरनाक दिखाई दे सकता है।
bwDraco

1
ज़रूर, हम url के लिए एक अनुरोध भेजते हैं, प्रतिक्रिया की केवल पहली पंक्ति प्राप्त करते हैं, इसे ब्लॉकों पर विभाजित करते हैं और दूसरे का चयन करते हैं। इसमें प्रतिक्रिया कोड होता है जिसे ओपी खोज रहा है।
फिलिप स्पिरिडोनोव

9

पोस्ट अनुरोध के लिए, निम्नलिखित कार्य किया गया:

curl -w 'RESP_CODE:%{response_code}' -s -X POST --data '{"asda":"asd"}' http://example.com --header "Content-Type:application/json"|grep -o  'RESP_CODE:[1-4][0-9][0-9]'

6

निम्नलिखित cURL कमांड का उपयोग करें और इसे इस तरह से पकड़ें:

$ कर्ल -I -s -L http://example.com/v3/get_list | grep "HTTP / 1.1"

यहां बताया गया है कि प्रत्येक ध्वज क्या करता है:

  • -I: केवल प्रतिक्रिया हेडर दिखाएं
  • -s: मौन - प्रगति बार न दिखाएं
  • -L: Location:हेडर का पालन करें

यहाँ HTTP स्टेटस कोड्स का लिंक दिया गया है

कमांड लाइन से चलाएं। यह कर्ल मूक मोड में चलता है, किसी भी पुनर्निर्देशन का अनुसरण करता है, HTTP हेडर प्राप्त करें। grep स्टैण्डर्ड आउटपुट को HTTP स्टेटस कोड प्रिंट करेगा।


5
curl -so -i /dev/null -w "%{http_code}"  http://www.any_example.com

यह निम्नलिखित जानकारी लौटाएगा:

  1. प्रतिक्रिया डेटा, अगर किसी भी डेटा को एपीआई द्वारा त्रुटि की तरह वापस किया जाता है
  2. स्थिति का कोड

यह पुनर्निर्देश का पालन नहीं करता है। यह मौजूदा जवाब बेहतर है superuser.com/a/442395/475508
cricket_007

ज़रूर, आप यह भी उल्लेख कर सकते हैं !!
शारना

4

यहाँ कुछ कर्ल कमांड है जो उपयोग कर रहा है GETऔर जो HTTP कोड लौटाता है।

curl -so /dev/null -w '%{response_code}' http://www.example.org

कृपया याद रखें कि नीचे का दृष्टिकोण उपयोग कर रहा है HEAD, जो तेज़ है लेकिन यह कुछ वेब कम संगत HTTP सर्वर के साथ अच्छी तरह से काम नहीं कर सकता है।

 curl -I http://www.example.org

कम से कम ओएस एक्स पर काम नहीं कर रहा है।
ऐन

ओएस एक्स हाई सिएरा 10.13.6 पर मेरे लिए काम करना ठीक है।
बेन बैरन

4

प्रतिक्रिया कोड का उपयोग कैसे करें का एक उदाहरण। मैं इसका उपयोग केवल जियोलाइट डेटाबेस को फिर से डाउनलोड करने के लिए करता हूं, यदि वे बदल गए हैं ( -z) और फिर से अनुप्रेषित ( -L) भी कर रहे हैं:

url=http://example.com/file.gz
file=$(basename $url)

response=$(curl -L -s -o $file -z $file $url -w "%{http_code}")

case "$response" in
        200) do_something ;;
        301) do_something ;;
        304) printf "Received: HTTP $response (file unchanged) ==> $url\n" ;;
        404) printf "Received: HTTP $response (file not found) ==> $url\n" ;;
          *) printf "Received: HTTP $response ==> $url\n" ;;
esac

3

ओपी स्टेटस कोड जानना चाहता है। अक्सर जब आप कोई फ़ाइल डाउनलोड करते हैं, तो आप उसका आकार भी महसूस करना चाहते हैं, इसलिए मैं पहले स्टेटस कोड और फ़ाइल का आकार दिखाने के लिए कर्ल का उपयोग कर रहा हूं और फिर उस जगह और नाम के लिए वर्बोज़ और डायरेक्ट फ़ाइल बंद कर देता हूं:

curl -R -s -S -w  "\nhttp: %{http_code} %{size_download}\n" -o /Users/myfiles/the_local_name.html http://archive.onweb.com/the_online_name.html

फिर मैं कर्ल के परिष्करण की प्रतीक्षा करता हूं

wait ${!}

इससे पहले कि मैं अगला आदेश चलाऊं। ऊपर जब कई कमांडों की स्क्रिप्ट में उपयोग किया जाता है तो ऊपर जैसी अच्छी प्रतिक्रिया मिलती है:

http: 200 42824

http: 200 34728

http: 200 35452

कृपया ध्यान दें कि -l कर्ल में फ़ाइल के पूर्ण पथ + फ़ाइल के नाम का पालन करने की आवश्यकता है। यह आपको इस प्रकार फ़ाइलों को एक समझदार नाम संरचना में सहेजने की अनुमति देता है जब आप उन्हें कर्ल के साथ डी / एल करते हैं। यह भी ध्यान दें कि -s और -S का उपयोग आउटपुट को मौन करता है लेकिन त्रुटियां दिखाता है। ध्यान दें कि -R वेब फ़ाइल के लिए फ़ाइल टाइमस्टैम्प को सेट करने का प्रयास करता है।

मेरा उत्तर इस बात पर आधारित है कि @pvandenberk ने मूल रूप से क्या सुझाव दिया था, लेकिन इसके अलावा यह वास्तव में फ़ाइल को कहीं न कहीं सेव करता है, बजाय केवल / dev / null को निर्देशित करने के।


1

आउटपुट सामग्री को stdoutHTTP और HTTP स्थिति कोड में विभाजित करें stderr:

curl http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2

यदि केवल HTTP स्थिति कोड को stderr के लिए वांछित है, तो --silentइसका उपयोग किया जा सकता है:

curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2

वांछित स्ट्रीम को अवांछित अवांछित पुनर्निर्देशित करके उठाया जा सकता है /dev/null:

$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 1>/dev/null
200
$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 2>/dev/null
<!doctype html>
...

ध्यान दें कि दूसरे पुनर्निर्देशन के लिए वांछित के रूप में व्यवहार करने के लिए, हमें उप-क्रम में कर्ल कमांड को चलाने की आवश्यकता है।


1
bashप्रक्रिया प्रतिस्थापन के लिए आवश्यक है ।
जाको

@Bruno, मैं से उदाहरण बदल superuser.com/revisions/1444693/2 , के रूप में मुझे लगता है कि /tmp/out /tmp/errफ़ाइलों अनपेक्षित परिणाम पैदा कर सकता है अगर समानांतर चलाते हैं।
जाकोको
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.