এইচটিটিপি স্থিতি কোডটি 200 না হলে আমি কি সিআরএল 0-এর চেয়ে আলাদা একটি প্রস্থানকোড দিয়ে ব্যর্থ করতে পারি?


237

আমি সবসময় অভিমানী হয় যে যখন কার্ল একটি HTTP 500 সাড়া পেয়েছি এটা একটা প্রস্থান কোডটি ব্যর্থতা বোঝানো (! = 0), কিন্তু যে মনে করা হয় ফিরছিলেন না কেস।

HTTP স্থিতি কোডটি 200 না হলে 0 থেকে আলাদা একটি প্রস্থানকোডের সাহায্যে আমি কী URL কে ব্যর্থ করতে পারি? আমি জানি যে আমি এটি ব্যবহার করতে পারি -w "%{http_code}"তবে এটি এটিকে প্রস্থান কোড হিসাবে নয়, এটি স্টটওউটে রাখে (এছাড়াও আমি আউটপুট ক্যাপচারে আগ্রহী, যা আমি কোনও ফাইলে পুনর্নির্দেশ করতে চাই না, তবে স্ক্রিনে)।

উত্তর:


262

curl --fail আপনি যা চান তার একটি অংশ করে:

থেকে man curl:

-f, --fail

(HTTP) সার্ভার ত্রুটিতে নিঃশব্দে ব্যর্থ (মোটেই আউটপুট নেই)। এটি বেশিরভাগই স্ক্রিপ্টগুলি আরও কার্যকর করতে ব্যর্থ প্রচেষ্টা সহ আরও ভাল করতে সক্ষম হয়। সাধারণ ক্ষেত্রে যখন কোনও এইচটিটিপি সার্ভার নথি সরবরাহ করতে ব্যর্থ হয়, এটি এমন একটি HTML ডকুমেন্ট ফেরত দেয় যাতে (যা প্রায়শই কেন এবং আরও কিছু বর্ণনা করে)। এই পতাকাটি কার্লটিকে আউটপুট করতে বাধা দেয় এবং ত্রুটি 22 ফেরত দেয়।

এই পদ্ধতিটি ব্যর্থ-নিরাপদ নয় এবং এমন অনুষ্ঠানগুলি রয়েছে যেখানে অ-সফল প্রতিক্রিয়া কোডগুলি স্লিপ হয়ে যায়, বিশেষত যখন প্রমাণীকরণ জড়িত থাকে (প্রতিক্রিয়া কোড 401 এবং 407)।

তবে এটি স্ক্রিনে আউটপুট ব্লক করে।


2
সুতরাং এটির কোন অংশ এটি করে এবং না করে?
রজারডপ্যাক

5
@ আরগারডপ্যাক টিএল; ডাঃ যখন কোনও খারাপ প্রতিক্রিয়া সনাক্ত করে তখন এটি ননজারো ফিরিয়ে দেয়, তবে ওপি এই প্রতিক্রিয়াটি ধরতে দেবে না
রায়পম্পান

3
এটি HTTP 301 স্থায়ীভাবে সরানো যায় না। কার্ল তবুও প্রস্থান কোড 0 দিয়েছে
উইসবাকী

4
@ উইসবাকি 301 ত্রুটি নয়, এটি একটি পুনঃনির্দেশ স্থিতি কোড। ত্রুটিগুলি 4xx এবং 5XX স্থিতি কোড।
এম জাস্টিন

1
@ উইসবাকি এইচটিটিপি ত্রুটি কোডের ননজারো থেকে প্রস্থান করতে এবং এইচটিটিপি পুনর্নির্দেশকে সঠিকভাবে পরিচালনা করতে curl -f -Lএবং কী করবে তার বিশদ জানতে এই প্রশ্নটি দেখুন see -L
নোহ সুসমান

81

আপনি যদি কেবল কার্ল পৃষ্ঠার বিষয়বস্তু প্রদর্শন করতে চান তবে আপনি এটি করতে পারেন:

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

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

STDOUT- তে HTTP স্থিতি কোডটি লেখার সময় এটি পৃষ্ঠার সামগ্রীটি STDERR তে লিখে রাখে, যাতে এটি পরিবর্তনশীল STATUSCODE এ নির্ধারিত হতে পারে ।


3
আমি কীভাবে ব্যর্থতার প্রতিক্রিয়া (200 নয়) আউটপুট দিতে চাইছি , তবে 0স্ক্রিপ্ট থেকে একটি নন- স্ট্যাটাস কোড ফিরিয়ে আনতে পারি?
জাস্টিন

2
@ জাস্টিন: কি হবে if [ "$statuscode" -ne 200 ]; then exit "$statuscode"; fi?
ঘোটি

4
@ ঘোটি: কেবল স্বাক্ষরযুক্ত 8-বিট প্রস্থান কোডগুলিই সমর্থিত, যাতে এটি কিছুটা বিভ্রান্তি পেতে পারে।
ডেনিস

3
আহ, ডান - এবং কোডগুলি 8 বিটগুলিতে মোড়ানো হবে, সুতরাং ত্রুটি 404 প্রস্থান মূল্য 148 হয়ে যায়, 500 হয়ে যায় 244। সত্যই বিভ্রান্তিকর! :-)
ঘোটি

7
সামান্য প্রকরণ হিসাবে, স্টডআউটকে প্রতিক্রিয়া পুনঃনির্দেশ করার সময় এই কোডটি একটি ভেরিয়েবলের মধ্যে ক্যাপচার করে: স্ট্রিকারটি নয়: { code=$(curl ... as above ...); } 2>&1কৌশলটি হ'ল { ... } 2>&1পুনর্নির্দেশের অনুমতি দেয়, অন্য রকম শেল যেমন ( ... )দেবে না তেমন করে ।
টোবিয়া

31

আমি পতাকাগুলির সংমিশ্রণটি ব্যবহার করে এটি করতে সক্ষম হয়েছি:

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

--সাইলেন্ট অগ্রগতি এবং ত্রুটিটি আড়াল করে
- শো -ত্রুটিটি ত্রুটি বার্তাটি লুকিয়ে দেখায় - --silent
ফেইল একটি প্রস্থান কোড ফেরত দেয়> 0 অনুরোধ ব্যর্থ হলে


5
এটি সার্ভারের উত্তর দেখায় না। আমি ওপি নই তবে আমার সন্দেহ হয় যে তিনি সার্ভার থেকে কোনও ত্রুটি বার্তা দেখতে চেয়েছিলেন যা দেহে ফিরে আসে। একটি --silent --show-error --failকাজ পাশাপাশি ঠিক হিসাবে কাজ -f/--fail
বর্জ্য

1
আসলে, --failপ্রস্থান কোড নিয়ে এসেছে 22, যেমন নথিভুক্ত
কোলোনেল প্রশ্ন

2
@ উইসবাকি 301 ত্রুটি নয়, এটি একটি পুনঃনির্দেশ স্থিতি কোড। ত্রুটিগুলি 4xx এবং 5XX স্থিতি কোড।
এম জাস্টিন

4
@ উইসবাকির কাছে ফর্সা হওয়ার জন্য, মূল প্রশ্নটি "[...] যদি HTTP স্থিতি কোডটি 200 না হয়" । এর আগে কোথাও "ত্রুটি" সম্পর্কে কোনও উল্লেখ নেই।
কেন

2
@ এম জাস্টিন কার্ল ম্যান-পৃষ্ঠা অনুসারে: এই পদ্ধতিটি ব্যর্থ-নিরাপদ নয় এবং এমন উপলক্ষগুলি রয়েছে যেখানে অ-সফল প্রতিক্রিয়া কোডগুলি স্লিপ হয়ে যায়, বিশেষত যখন প্রমাণীকরণ জড়িত থাকে (প্রতিক্রিয়া কোড 401 এবং 407)।
youfu

0

হ্যাঁ এটি করার একটি উপায় আছে তবে এটি সুস্পষ্ট থেকে দূরে কারণ এটিতে 3 কার্ল বিকল্প রয়েছে:

curl -s --fail --show-error https://httpbin.org/status/200 > /dev/null
curl -s --fail --show-error https://httpbin.org/status/401 > /dev/null
curl -s --fail --show-error https://httpbin.org/status/404 > /dev/null
curl -s --fail --show-error https://bleah-some-wrong-host > /dev/null

এটি আশ্বাস দেয় যে সাফল্য (0) কেবল তখনই ঘটে যখন চূড়ান্ত 2xxরিটার্ন কোড দিয়ে আমাদের কার্ল শেষ হয় এবং stdoutএটি শরীর পায় এবং কোনও ত্রুটি স্ট্যাডারকে প্রদর্শিত হবে।

দয়া করে নোট করুন যে কার্ল ডকুমেন্টেশন আপনাকে কিছুটা বিভ্রান্ত করতে পারে কারণ এতে উল্লেখ করা হয়েছে যে - 405 কোডের জন্য সাফল্য আসতে পারে। সত্য নয় এমন পরীক্ষার উপর ভিত্তি করে, কমপক্ষে একই সময়ে - শো-ত্রুটি ব্যবহার করার সময় নয়।

এখনও অবধি আমি কোনও ক্ষেত্রেই সন্ধান করতে পারিনি যেখানে কার্লগুলি যখন এই বিকল্পগুলির সাথে কোনও http- সাফল্য ছিল না তখন সাফল্য ফিরে আসবে।


1
এটি কি মূলত রিকার্ডো সৌজার মতো একই উত্তর?
16
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.