प्रतिक्रिया के साथ http स्थिति कोड वापस करने के लिए कर्ल करें


113

मैं HTTP हेडर को http स्थिति कोड खोजने के लिए कर्ल का उपयोग करता हूं और प्रतिक्रिया भी देता हूं। मुझे कमांड के साथ http हेडर मिलते हैं

curl -I http://localhost

प्रतिक्रिया प्राप्त करने के लिए, मैं कमांड का उपयोग करता हूं

curl http://localhost

जैसे ही मैं -I ध्वज का उपयोग करता हूं, मुझे केवल हेडर मिलते हैं और प्रतिक्रिया नहीं होती है। क्या http कमांड और हेडर / http स्टेटस कोड दोनों को एक कमांड में प्राप्त करने का कोई तरीका है?


1
यहां एक बहुत ही उपयोगी स्निपेट gist.github.com/maxcnunes/9f77afdc32df354883df
रॉकेट्सपेसर

जवाबों:


111

मैं कर्ल डॉक को देखकर समाधान प्राप्त करने में सक्षम था जो -आउटपुट को स्टडआउट करने के लिए आउटपुट के लिए उपयोग करने के लिए निर्दिष्ट करता है ।

curl -o - http://localhost

बस http रिटर्न कोड के साथ प्रतिक्रिया पाने के लिए, मैं बस कर सकता था

curl -o /dev/null -s -w "%{http_code}\n" http://localhost

14
या आप उपयोग करेंगे -i। या शायद -vअगर आपको कुछ अतिरिक्त जानकारी भी पसंद है।
डैनियल स्टेनबर्ग

2
साभार @DanielStenberg स्वीकार किए गए उत्तर ने मेरे लिए काम नहीं किया, बस -आई ने काम किया।
अलेजांद्रो कोटिला

आपका दूसरा आदेश याद आ रहा है -I @randominstanceOfLivingThing, जब तक कि जानबूझकर एक खाली विकल्प नहीं है? हालांकि इसके बिना मेरे लिए काम नहीं करता है
md123123

2
-o -I-ICWD में शाब्दिक रूप से ' ' नामक एक फाइल बनाते हुए। क्या कोई और इसे देखता है? इसका समाधान है-o/dev/null -I
JDS

हटा दिया -I। मैंने देखा और अब ठीक किया। आपको -I की आवश्यकता नहीं है।
randominstanceOfLivingThing


36

मैं बिना किसी अन्य आउटपुट के स्थिति कोड को प्रिंट करने के लिए इस कमांड का उपयोग करता हूं। इसके अतिरिक्त, यह केवल एक HEAD अनुरोध करेगा और पुनर्निर्देशन (क्रमशः -Iऔर -L) का पालन करेगा ।

curl -o -I -L -s -w "%{http_code}" http://localhost

इससे स्वास्थ्य लिपि में स्थिति कोड की जाँच करना बहुत आसान हो जाता है:

sh -c '[ $(curl -o -I -L -s -w "%{http_code}" http://localhost) -eq 200 ]'

5
इसका जवाब एक साल पहले ही दिया जा चुका है। आपका उत्तर क्या नया मूल्य लाता है? कृपया अपने उत्तर के लिए कुछ स्पष्टीकरण भी लिखें।
मैकीज जुरेस्को

11
@MaciejJureczko - मूल्य सरल है। स्क्रिप्टिंग उद्देश्यों के लिए, यह उत्तर अन्य सभी उत्तरों में से सबसे अच्छा है, क्योंकि यह उक्त स्टेटस कोड के साथ कूड़े की कई पंक्तियों के बजाय एक एकल स्थिति कोड देता है।
समुच्चय

2
लेकिन ओपी विशेष रूप से कहता है कि वे स्थिति कोड और प्रतिक्रिया निकाय दोनों चाहते हैं । वे जानते हैं कि कैसे प्रतिक्रिया कोड प्राप्त करना है (प्रश्न में कहा गया है)
wottle

2
जब भी मैं इसका उपयोग करता हूं तो curl -o -I -L -s -w "%{http_code}" http://localhostएक फाइल बनाई जाती है जिसे कहा जाता है -I, इसके चारों ओर जाने के लिए मैंने फ़ाइल आउटपुट के लिए एक स्थान जोड़ा है जो -oकि जाने के लिए निहित है /dev/null:curl -o /dev/null -I -L -s -w "%{http_code}" http://localhost
Thismatters

HEAD हमेशा परिणाम के रूप में एक ही आउटपुट में परिणाम नहीं देगा, हालांकि सर्वर तक वे कैसे प्रतिक्रिया देते हैं। तो यह वास्तव में एक जवाब नहीं है।
एडी

28

मुझे यह प्रश्न इसलिए मिला क्योंकि मैं उपयोगकर्ता के लिए कुछ त्रुटि हैंडलिंग जोड़ने के लिए प्रतिक्रिया और सामग्री चाहता था।

आप std out और दूसरी फाइल पर कंटेंट लिखने के लिए HTTP स्टेटस कोड प्रिंट कर सकते हैं।

curl -s -o response.txt -w "%{http_code}" http://example.com

चलो यह तय करने के लिए तर्क का उपयोग करते हैं कि क्या प्रतिक्रिया प्रसंस्करण के लायक है।

http_response=$(curl -s -o response.txt -w "%{http_code}" http://example.com)
if [ $http_response != "200" ]; then
    # handle error
else
    echo "Server returned:"
    cat response.txt    
fi

http_code क्या है? मुझे यह समझ में नहीं आता, अधिक स्पष्टीकरण की आवश्यकता है pls
अलेक्जेंडर मिल्स

ऊपर स्पष्ट किया गया है, यह HTTP स्थिति कोड - developer.mozilla.org/en-US/docs/Web/HTTP/Status
एडी

22

-iविकल्प है कि आप चाहते हैं:

curl -i http://localhost

-i, - शामिल करें आउटपुट में प्रोटोकॉल हेडर शामिल करें (H / F)

वैकल्पिक रूप से आप क्रिया विकल्प का उपयोग कर सकते हैं:

curl -v http://localhost

-v, --verbose ऑपरेशन को अधिक बातूनी बनाएं


16

मैंने इसका उपयोग किया है:

    request_cmd="$(curl -i -o - --silent -X GET --header 'Accept: application/json' --header 'Authorization: _your_auth_code==' 'https://example.com')"

HTTP स्टेटस प्राप्त करने के लिए

    http_status=$(echo "$request_cmd" | grep HTTP |  awk '{print $2}')
    echo $http_status

प्रतिक्रिया शरीर पाने के लिए मैंने इसका उपयोग किया है

    output_response=$(echo "$request_cmd" | grep body)
    echo $output_response

8

यह आज्ञा

 curl http://localhost -w ", %{http_code}"

अल्पविराम से अलग किया गया शरीर और स्थिति प्राप्त करेंगे; आप उन्हें बाहर निकालने के लिए विभाजित कर सकते हैं।

आप अपनी इच्छानुसार परिसीमन को बदल सकते हैं।


2
अच्छा संकेत! क्या आउटपुट के सामने स्टेटस कोड जोड़ना संभव है?
साइकोजोइक

6

प्रोग्रामेटिक उपयोग के लिए, मैं निम्नलिखित का उपयोग करता हूं:

curlwithcode() {
    code=0
    # Run curl in a separate command, capturing output of -w "%{http_code}" into statuscode
    # and sending the content to a file with -o >(cat >/tmp/curl_body)
    statuscode=$(curl -w "%{http_code}" \
        -o >(cat >/tmp/curl_body) \
        "$@"
    ) || code="$?"

    body="$(cat /tmp/curl_body)"
    echo "statuscode : $statuscode"
    echo "exitcode : $code"
    echo "body : $body"
}

curlwithcode https://api.github.com/users/tj

यह निम्नलिखित उत्पादन दिखाता है:

statuscode : 200
exitcode : 0
body : {
  "login": "tj",
  "id": 25254,
  ...
}

5

यह निकाय "और" स्थिति कोड को पुनः प्राप्त करने का एक तरीका है और इसे एक उचित json या आपके लिए जो भी प्रारूप काम करता है, उसे प्रारूपित करता है। कुछ का तर्क हो सकता है कि यह लिखने के प्रारूप विकल्प का गलत उपयोग है, लेकिन यह मेरे लिए तब काम करता है जब मुझे स्थिति कोड की जांच करने और सर्वर से प्रतिक्रियाओं को वापस लेने के लिए अपनी स्क्रिप्ट में शरीर और स्थिति कोड दोनों की आवश्यकता होती है।

curl -X GET -w "%{stderr}{\"status\": \"%{http_code}\", \"body\":\"%{stdout}\"}"  -s -o - https://github.com 2>&1

ऊपर दिए गए कोड को चलाएं और आपको इस प्रारूप में एक json वापस प्राप्त करना चाहिए:

{
"status" : <status code>,
"body" : <body of response>
}

-w लिखने के प्रारूप विकल्प के साथ, चूंकि स्टॉडर पहले मुद्रित होता है, आप अपने आउटपुट को var http_code के साथ प्रारूपित कर सकते हैं और प्रतिक्रिया के शरीर को एक मान (बॉडी) में रख सकते हैं और var stdout का उपयोग करके एन्क्लोज़िंग का अनुसरण कर सकते हैं। फिर अपने stderr आउटपुट को stdout पर पुनर्निर्देशित करें और आप http_code और प्रतिक्रिया बॉडी दोनों को एक साफ आउटपुट में संयोजित करने में सक्षम होंगे


1
निम्नलिखित त्रुटि मिली - curl: unknown --write-out variable: 'stderr'औरcurl: unknown --write-out variable: 'stdout'
ALex_hha

curl.haxx.se/docs/manpage.html मैन पेज उपलब्ध चर दिखाता है। यह निश्चित नहीं है कि स्टैडर को आपके कर्ल, मैकबुक पर कर्ल की पहचान क्यों नहीं है। इस लिनक्स कर्ल डॉक से, computerhope.com/unix/curl.htm , मैं स्टैडर को एक चर के रूप में नहीं देखता। शायद यह एक OS भिन्नता है।
ट्रान

केवल एक ही मुद्दा मेरे पास है अगर आपके शरीर में अवतरण के निशान हैं, जैसे कि यदि इसका जौन, शरीर अमान्य
जोंस से

काफी हद तक @theannouncer, मैं उम्मीद करूँगा कि देवता अपने हिसाब से तालमेल बिठा लेंगे क्योंकि सभी प्रतिक्रियाएँ मानक जुबान नहीं होंगी। प्रतिक्रिया की प्रकृति के कारण मुझे कुछ उदाहरणों को समायोजित करना पड़ा।
T:

2

इसे प्राप्त करने का मेरा तरीका :

दोनों (हेडर और बॉडी) प्राप्त करने के लिए, मैं आमतौर पर इसमें curl -D- <url>निम्न कार्य करता हूं :

$ curl -D- http://localhost:1234/foo
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Date: Wed, 29 Jul 2020 20:59:21 GMT

{"data":["out.csv"]}

यह हेडर ( -D) को स्टडआउट ( -) ( मैन कर्ल--dump-header में देखें ) को डंप करेगा ।

इस संदर्भ में IMHO भी बहुत काम आता है:

मैं अक्सर उस json डेटा (जैसे कुछ बाकी एपीआई से) को स्वरूपित करने के लिए jq का उपयोग करता हूं । लेकिन जैसा कि jq एक HTTP हेडर की उम्मीद नहीं करता है, यह ट्रिक हेडर को स्ट्रैडर का उपयोग करके प्रिंट करने के लिए है -D/dev/stderr। ध्यान दें कि इस बार हम -sSप्रगति मीटर को दबाने के लिए (--silent, --show- त्रुटियों) का उपयोग करते हैं (क्योंकि हम एक पाइप को लिखते हैं)।

$ curl -sSD/dev/stderr http://localhost:1231/foo | jq .
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Date: Wed, 29 Jul 2020 21:08:22 GMT

{
  "data": [
    "out.csv"
  ]
}

मुझे लगता है कि यह भी आसान हो सकता है अगर आप हेडर को प्रिंट करना चाहते हैं (त्वरित निरीक्षण के लिए) लेकिन कंसोल के लिए बॉडी को एक फ़ाइल में प्रिंट करना चाहते हैं (जैसे कि जब किसी तरह का बाइनरी आपके टर्मिनल को गड़बड़ाने के लिए नहीं):

$ curl -sSD/dev/stderr http://localhost:1231 > /dev/null
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Date: Wed, 29 Jul 2020 21:20:02 GMT

जागरूक रहें: यह वैसा नहीं है curl -I <url>! के रूप में -Iएक प्रदर्शन करेंगे HEADअनुरोध और नहीं एक GETके लिए अनुरोध (देखो --headमें आदमी कर्ल हाँ:। सबसे HTTP सर्वर के लिए यह समान ही परिणाम मिलेगा लेकिन मैं व्यावसायिक अनुप्रयोगों जो लागू नहीं करते की एक बहुत कुछ पता है। HEADसभी ;-P पर अनुरोध


-2
while : ; do curl -sL -w "%{http_code} %{url_effective}\\n" http://host -o /dev/null; done

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