سؤال هل يمكنني جعل cURL تفشل مع exitCode مختلفة عن 0 إذا كان رمز حالة HTTP ليس 200؟


كنت أفترض دائمًا أنه عندما حصل curl على استجابة HTTP 500 ، فإنه كان يعيد رمز الخروج الذي يعني الفشل (! = 0) ، ولكن يبدو أن هذا ليس القضية.

هل هناك طريقة يمكنني بها تفكيك cURL باستخدام رمز exitCode مختلف عن 0 إذا لم يكن رمز حالة HTTP 200؟ وأنا أعلم أنني يمكن استخدامها -w "%{http_code}" ولكن ذلك يضعها في STDOUT ، وليس كجهاز للخروج (بالإضافة إلى ذلك ، فأنا مهتم أيضًا بالتقاط الإخراج ، الذي لا أريد إعادة توجيهه إلى ملف ، ولكن إلى الشاشة).


170
2018-05-01 12:37


الأصل




الأجوبة:


curl --fail جزء من ما تريده:

من عند man curl:

-f, --fail

(HTTP) يفشل بصمت (لا يوجد مخرجات على الإطلاق) على أخطاء الخادم. يتم ذلك في الغالب لتمكين البرامج النصية بشكل أفضل إلخ للتعامل بشكل أفضل مع المحاولات الفاشلة. في الحالات العادية عندما يفشل خادم HTTP في تسليم مستند ، فإنه يقوم بإرجاع مستند HTML ينص على ذلك (والذي غالباً ما يصف أيضاً السبب والمزيد). ستمنع هذه العلامة curl من إخراج ذلك وإرجاع الخطأ 22.

هذه الطريقة ليست آمنة من الفشل ، وهناك مناسبات تتدفق فيها رموز الاستجابة غير الناجحة ، خاصة عندما تكون المصادقة متضمنة (أكواد الاستجابة 401 و 407).

لكنه يمنع الإخراج إلى الشاشة.


191
2017-10-10 18:36



أي أجزاء منها تقوم بها ولا تفعل؟ - rogerdpack
rogerdpack tl؛ dr لا يقوم بإرجاع غير صفرية عندما يكتشف استجابة سيئة ، ولكنه لن يسمح لـ OP بالتقاط الاستجابة - rampion
هذا لا يمسك HTTP 301 تحرك بشكل دائم. لا يزال يعطي curl رمز الإنهاء 0. - wisbucky
wisbucky 301 ليس خطأ ، إنه رمز حالة إعادة التوجيه. أخطاء رموز الحالة 4xx و 5xx. - M. Justin


إذا كنت ترغب فقط في عرض محتويات الصفحة المجعدة ، فيمكنك القيام بذلك:

STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}" URL)

if test $STATUSCODE -ne 200; then
    # error handling
fi

هذا يكتب محتوى الصفحة إلى STDERR أثناء كتابة رمز حالة HTTP إلى STDOUT ، بحيث يمكن تخصيصه للمتغير STATUSCODE.


67
2018-05-01 15:31



ماذا عن ما إذا كنت تريد إخراج الاستجابة عند الفشل (غير 200)، ولكن العودة غير 0 رمز الحالة من البرنامج النصي؟ - Justin
@ جستن: ماذا عن if [ "$statuscode" -ne 200 ]; then exit "$statuscode"; fi ؟ - ghoti
@ ghoti: يتم دعم رموز الإنهاء 8 بت فقط غير الموقعة ، بحيث يمكن الحصول على بعض الارتباك. - Dennis
آه ، اليمين - والرموز سوف تلتف على 8 بت ، لذلك الخطأ 404 يصبح قيمة الخروج 148 ، 500 يصبح 244. مربكا حقا! :-) - ghoti
كاختلاف بسيط ، يلتقط هذا الرمز في متغير أثناء إعادة توجيه الاستجابة إلى stdout ، وليس stderr: { code=$(curl ... as above ...); } 2>&1 الخدعة هي { ... } 2>&1 التي تسمح بإعادة التوجيه ، في حين لا تنتج قشرة أخرى ( ... ) سيكون. - Tobia


تمكنت من القيام بذلك باستخدام مزيج من الأعلام:

curl --silent --show-error --fail URL

--silent يخفي التقدم والخطأ
--show من الأخطاء يعرض رسالة الخطأ مخفية بواسطة --silent
--فشل إرجاع رمز إنهاء> 0 عندما يفشل الطلب


14
2017-09-12 14:48



هذا لا يظهر رد الخادم. أنا لست OP لكن أظن أنه يريد أن يرى أي رسالة خطأ من الخادم الذي يتم إرجاعه في الجسم. الى جانب --silent --show-error --fail يعمل بنفس الطريقة فقط -f/--fail. - waste
في الواقع، --fail إرجاع رمز الخروج 22، كما موثقة. - Quolonel Questions
هذا لا يمسك HTTP 301 تحرك بشكل دائم. لا يزال يعطي curl رمز الإنهاء 0. - wisbucky
wisbucky 301 ليس خطأ ، إنه رمز حالة إعادة التوجيه. أخطاء رموز الحالة 4xx و 5xx. - M. Justin
لكي نكون منصفين ل @ wisbucky ، فإن السؤال الأصلي ينص "[...] إذا لم يكن رمز حالة HTTP 200". لا يذكر "خطأ" في أي مكان قبل. - ken