سؤال الحصول على curl لإخراج رمز حالة HTTP؟


أنا استخدم curl في سطر الأوامر على Linux لإصدار طلبات HTTP. تتم طباعة أجسام الاستجابة على مستوى قياسي ، وهو أمر جيد ، ولكن لا يمكنني أن أرى من صفحة الرجل كيفية الحصول على curl لطباعة رمز حالة HTTP من الرد (404 ، 403 ، الخ). هل هذا ممكن؟


618
2018-04-18 10:28


الأصل


بالنسبة لي ، يمكنني أن أرى من الدليل كيفية الحصول على رمز حالة HTTP ، ولكن لا يعمل الخيار -w. لقد أبلغت عن خلل أبل. - Nicolas Barbulesco
ال -i العلم ، كما هو الحال في curl -i https://www.example.com/، ربما ما تريد ، كما في superuser.com/a/514798/190188 - caw


الأجوبة:


هذا يجب أن تعمل من أجلك إذا خادم الويب قادر على الاستجابة لطلبات HEAD (لن يؤدي ذلك إلى تنفيذ GET):

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

كإضافة ، للسماح لـ cURL بمتابعة إعادة التوجيه (3x الحالات) إضافة -L.


383
2018-04-18 10:56



NB: curl -I يقوم بطلب HTTP HEAD ، والذي قد يكون مشكلة في اختبار رمز حالة HTTP لبعض خوادم تطبيقات الويب والخدمات - Jay Taylor
وللحصول على رقم الحالة فقط ، قم بتوجيهه إلى head -n 1|cut -d$' ' -f2 - Benubird
لا تنس إعادة توجيه stderr curl: curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2. أضف -L إلى curl إذا كنت بحاجة إلى الحالة النهائية بعد عمليات إعادة التوجيه. - Aaron Blenkush
بعد إعادة التوجيه بعد إجراء طلب HEAD فقط قد يسبب سلوكًا مثيرًا للاهتمام ، اعتمادًا على كيفية برمجة التطبيق. - Scott McIntyre
curl -I -X GET سوف ترسل طلب GET ، ولكن تعطي نفس الإخراج. - jiggy


طريقة أكثر تحديدًا للطباعة مجرد رمز حالة 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/

665
2018-06-28 00:25



-w "٪ {http_code}" هي الجزء الذي يطبع رمز الحالة. يمكنك إضافة سطر جديد أو إثنان هناك لفصل الرمز عن النص (-w "\ n \ n٪ {http_code} \ n") - Jeffrey Martinez
واو ، هذا /dev/null حتى يعمل في نسخة Windows من الضفيرة التي أستخدمها. - Uwe Keim
أعتقد أن هذا يؤدي إلى تنزيل الملف بأكمله على الرغم من أن كل ذلك ينتقل إلى / dev / null ، لذا فهو غير مثالي للتحقق من رمز الحالة للملفات الضخمة. httping -c 1 -s -G -m تصدر GET ولا تقوم بتنزيل الملف بأكمله ، على الرغم من أنني أدرك أن هذا السؤال هو بالتحديد حول curl. - RomanSt
romkyns ، أنت على صواب: يقوم الخيار الأول في إجابتي بتنزيل الملف بأكمله و "حفظه" إلى /dev/null، ولكن البديل الثاني - أي. واحد باستخدام -I الخيار ل curl - لا. ومع ذلك ، يجب توخي الحذر ، حيث إنك لا تختبر بالفعل نفس الإجراء: أحدهما يقوم بـ HTTP GET طلب ، في حين أن الآخر يجعل HEAD طلب ... سترد بعض مواقع الويب / مواقع الويب برمز حالة مختلف ، حتى إذا كان عنوان URL المطلوب هو نفسه تمامًا! - pvandenberk
لمعلوماتك: -s = لا تعرض تقدم التنزيل ، -o /dev/null = لا تعرض الجسد ، -w "%{http_code}" = اكتب رمز الاستجابة http إلى stdout بعد الخروج. - Ajedi32


إذا كنت ترغب في رؤية العنوان بالإضافة إلى النتيجة ، فيمكنك استخدام الخيار المطول:

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

177
2018-05-03 04:28



+1 للإشارة إلى العلم المطول يوفر التفاصيل الإضافية. رائعة لاختبار تطبيقات REST. - MrOodles
+1 سهل الاستخدام للغاية عند إجراء طلب POST (curl -v --data "...") - MegaTux
حتى تقسيمها في مخرجات ملفين مختلفين (تفاصيل حالة http إلى stderr وجسم الاستجابة إلى stdout) - Blauhirn


يمكنك طباعة رمز الحالة ، بالإضافة إلى جميع العناوين عن طريق القيام بما يلي:

curl -i http://example.org

الشيء الجيد في -i هو أنه يعمل مع -X POST كذلك.


153
2017-12-04 20:45



أفضل بكثير من الإجابة المقبولة (التي تتطلب طلب الرأس). - neu242
ربما واضح ، ولكن -i يعمل مع أي طريقة HTTP ، وليس فقط GET و POST... :) - mac
أفضل إجابة لأنها تجعل إخراج curl رأسية وجسم ، مما يجعلها مناسبة لمعظم المهام عند استخدامها في برنامج نصي - Sarge Borsch
هذا هو أفضل إجابة ، ويمكن استخدامه بالاقتران مع -s (لا تظهر متر التقدم أو رسائل الخطأ) و -S(هل تظهر رسائل الخطأ بعد كل شيء) - Jonathan Hartley


إذا كنت تريد التقاط رمز حالة HTTP في متغير ، ولكن مع إعادة توجيه المحتوى إلى STDOUT ، فيجب إنشاء اثنين من STDOUTs. يمكنك القيام بذلك مع عملية استبدال> () و استبدال الأمر $ ().

أولاً ، قم بإنشاء واصف ملف 3 لعمليتك الحالية "STDOUT مع exec 3>&1.

ثم استخدم curl -o الخيار لإعادة توجيه محتوى الاستجابة إلى fifo مؤقت باستخدام استبدال الأمر ، ومن ثم في استبدال ذلك الأمر ، إعادة توجيه الإخراج مرة أخرى إلى العملية الحالية واصف ملف 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')

لاحظ أن هذا لا يعمل /bin/sh مثل لاحظ SamK في التعليقات أدناه.


49
2018-01-08 20:59



هذا هو جليدي خطيرة ... وأنا أحب ذلك! - spyle
الآن ، كيف يمكنني ، بدوره ، إعادة توجيه الإخراج إلى متغير آخر؟ - Roger Filmyer
الإخراج في STDOUT، لذلك يجب أن تكون قادراً على إعادة توجيه الإخراج من الأمر إلى أي مكان تريد فقط مثل أمر عادي. أنا لم اختبار هذا رغم ذلك. - Heath Borders
لا يعمل مع / bin / sh. - SamK


إعادة تعريف إخراج curl:

curl -sw '%{http_code}' http://example.org

يمكن استخدامها مع أي نوع طلب.


27
2017-08-05 18:18



-k (--insecure) هو overriding -s (صامت). - Ravichandra


سيؤدي هذا إلى إرسال طلب إلى عنوان url ، والحصول على السطر الأول فقط من الرد ، وتقسيمه إلى كتل وتحديد الثاني.

يحتوي على رمز الاستجابة

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

10
2017-07-15 20:08



هل يمكن أن توضح ما يفعله هذا الكود وكيف يعالج المشكلة التي قدمها البروتوكول الاختياري؟ يمكن أن تظهر الشفرة غير المبررة غير موثوقة وخطيرة للمستخدمين. - bwDraco
بالتأكيد ، نرسل طلبًا إلى عنوان url ، نحصل على السطر الأول فقط من الرد ، ونقسمه على الكتل ونحدد الخيار الثاني. يحتوي على رمز الاستجابة الذي تبحث عنه OP. - Filip Spiridonov


رمز الحالة فقط

[0]$ curl -LI http://www.example.org -o /dev/null -w '%{http_code}\n' -s
[0]$ 200

كل الفضل في ذلك جوهر


10
2018-02-08 10:44





بالنسبة لطلب POST ، يعمل ما يلي:

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]'

8
2018-01-07 08:36