এইচটিটিপি স্থিতি কোড আউটপুট এ কার্ল পাচ্ছেন?


796

আমি curlলিনাক্সের কমান্ড লাইনে এইচটিটিপি অনুরোধ জারি করতে ব্যবহার করছি । প্রতিক্রিয়া সংস্থাগুলি স্ট্যান্ডার্ড আউট প্রিন্ট করা হয়, যা ভাল, তবে আমি প্রতিক্রিয়ার (404, 403 ইত্যাদি) থেকে এইচটিটিপি স্থিতি কোড মুদ্রণের জন্য কার্ল কীভাবে পাবেন তা ম্যান পৃষ্ঠা থেকে দেখতে পাচ্ছি না। এটা কি সম্ভব?


আমার হিসাবে, আমি HTTP স্থিতি কোডটি কীভাবে পাবেন তা ম্যানুয়াল থেকে দেখতে পারি, তবে বিকল্প -w কাজ করে না। আমি অ্যাপলকে বাগটি জানিয়েছি।
নিকোলাস বারবুলেসকো

19
-iপতাকা, হিসাবে curl -i https://www.example.com/, সম্ভবত তুমি কি অনুযায়ী চাই, হয় superuser.com/a/514798/190188
কাকের ডাক

কেন শুধু কিছু না curl -IL http://www.example.com | grep "^HTTP\/"?
St3an

ভবিষ্যতের স্ব-প্রতি নয়: আপনি যে উত্তরটি চান তা হ'ল সম্ভবত সিরিল ডেভিডের (বর্তমানে চতুর্থ অবস্থানে রয়েছে)
হোয়াইট হটলভ টাইগার

উত্তর:


524

ওয়েব সার্ভার যদি হেড অনুরোধগুলিতে প্রতিক্রিয়া জানাতে সক্ষম হয় তবে এটি আপনার পক্ষে কাজ করবে (এটি একটি সম্পাদন করবে না GET):

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

সংযোজন হিসাবে, সিআরএলকে পুনর্নির্দেশগুলি অনুসরণ করতে (3xx স্থিতিগুলি) -এল যোগ করতে।


154
এনবি: curl -Iএকটি হেড এইচটিটিপি অনুরোধ করে, যা কিছু ওয়েব অ্যাপ্লিকেশন সার্ভার এবং পরিষেবাদির জন্য এইচটিটিপি স্থিতি কোড পরীক্ষার জন্য সমস্যাযুক্ত হতে পারে
জে টেলর

16
এবং কেবল স্থিতির নম্বর পেতে, এটিতে পাইপ করুনhead -n 1|cut -d$' ' -f2
বেনুবার্ড

33
ভুলবেন না কার্ল এর দ্বারা stderr পুনর্নির্দেশ করতে: curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2। পুনর্নির্দেশের পরে আপনার চূড়ান্ত স্থিতির প্রয়োজন হলে কার্ল করতে যুক্ত করুন L
অ্যারন ব্লেনকুশ

1
কেবলমাত্র একটি হেড অনুরোধ করার পরে পুনঃনির্দেশ অনুসরণ করা অ্যাপ্লিকেশনটি কীভাবে প্রোগ্রাম করা হয় তার উপর নির্ভর করে আকর্ষণীয় আচরণের কারণ হতে পারে।
স্কট ম্যাকআইন্টির

31
curl -I -X GETএকটি জিইটি অনুরোধ পাঠাবে, তবে একই আউটপুট দেবে।
জিগি

835

কেবলমাত্র HTTP স্থিতি কোড মুদ্রণের জন্য আরও একটি সুনির্দিষ্ট উপায় হ'ল লাইনগুলি সহ কিছু:

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

স্ক্রিপ্টগুলিতে কাজ করা অনেক সহজ, কারণ এতে কোনও পার্সিংয়ের প্রয়োজন হয় না :-)

-Iপ্রতিক্রিয়া লোড কর্মক্ষমতা উন্নত করতে পরামিতি যুক্ত করা যেতে পারে might এই পরামিতিটি ডাউনলোড প্রতিক্রিয়া বডি ছাড়াই কেবলমাত্র প্রতিক্রিয়ার স্থিতি / শিরোনামের জন্য অনুরোধ করছে।

দ্রষ্টব্য: %{http_code} এইচটিটিপি পে-লোডের প্রথম লাইনে ফিরে আসে

অর্থাৎ,

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

54
-w "% {http_code}" হ'ল বিট যা স্থিতি কোডটি প্রিন্ট করে। কোডটি শরীর থেকে আলাদা করার জন্য আপনি সেখানে একটি নতুন লাইন যোগ করতে পারেন (-উ "\ n \ n% _ http_code} \ n")
জেফ্রি মার্টিনেজ

7
বাহ, এই /dev/nullজিনিসটি আমি যে কার্লটি ব্যবহার করছি তার উইন্ডোজ সংস্করণেও কাজ করে।
উয়ে কেইম

3
আমি বিশ্বাস করি এটি পুরো ফাইলটি ডাউনলোড করে যদিও এটি সমস্ত কিছু / dev / নালায় যায়, তাই বিশাল ফাইলগুলির স্থিতি কোড পরীক্ষা করার জন্য আদর্শ নয়। httping -c 1 -s -G -mএকটি জিইটি ইস্যু করে এবং পুরো ফাইলটি ডাউনলোড করে না, যদিও আমি বুঝতে পারি যে এই প্রশ্নটি বিশেষভাবে কার্ল সম্পর্কে।
রোমানস্টে

40
এফওয়াইআই: -s= ডাউনলোডের অগ্রগতি দেখাবেন না, -o /dev/null= শরীর প্রদর্শন করবেন না, -w "%{http_code}"= প্রস্থানের পরে স্ট্যান্ডআউটে HTTP প্রতিক্রিয়া কোড লিখুন।
আজেদী 32

1
"% {Http_code around" এর আশেপাশের উক্তিগুলি কি প্রয়োজনীয়?
হাকান বাবা

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 অ্যাপ্লিকেশন পরীক্ষার জন্য দুর্দান্ত।
মিস্টার ওডলস

8
পোষ্ট অনুরোধ করার সময় +1 ব্যবহার করা খুব সহজ (কার্ল-ভি --ডাটা "...")
মেগাটাক্স

1
এমনকি এটি তাদের দুটি পৃথক ফাইল আউটপুটগুলিতে বিভক্ত করে
তোলে

201

নিম্নলিখিতগুলি করে আপনি সমস্ত শিরোনাম ছাড়াও স্থিতি কোডটি মুদ্রণ করতে পারেন:

curl -i http://example.org

সম্পর্কে ভাল জিনিস -iএটি -X POSTপাশাপাশি কাজ করে ।


36
স্বীকৃত উত্তরের চেয়ে অনেক ভাল (যা একটি হেড অনুরোধ করে)।
neu242

10
সম্ভবত সুস্পষ্ট, তবে কোনও HTTP পদ্ধতি -iনিয়ে কাজ করে , কেবল এবং ... :)GETPOST
ম্যাক

3
স্ক্রিপ্টে যখন ব্যবহৃত হয় তখন বেশিরভাগ কাজের জন্য এটি উপযুক্ত করে তোলে এবং এটি কার্ড আউটপুট উভয় শিরোলেখ এবং শিরোনামকে তৈরি করে বলে সর্বোত্তম উত্তর
সার্জে বোর্স

6
এটি সেরা উত্তর, এবং -s(অগ্রগতির মিটার বা ত্রুটি বার্তাগুলি -Sদেখাবেন না ) এবং (সর্বোপরি ত্রুটি বার্তাগুলি দেখান ) এর সাথে একত্রে ব্যবহার করা যেতে পারে
জোনাথন হার্টলে

69

আপনি যদি কোনও ভেরিয়েবলের মধ্যে এইচটিটিপি স্থিতি কোডটি ক্যাপচার করতে চান তবে তবুও সামগ্রীটি STDOUT- এ পুনর্নির্দেশ করতে পারেন, আপনাকে অবশ্যই দুটি STDOUT তৈরি করতে হবে। প্রক্রিয়া প্রতিস্থাপন> () এবং কমান্ড প্রতিস্থাপন $ () দিয়ে আপনি এটি করতে পারেন ।

প্রথমত, একটি ফাইল বর্ণনাকারী তৈরি 3আপনার বর্তমান প্রক্রিয়া 'stdout- এ সঙ্গে জন্য exec 3>&1

তারপরে, -oকমান্ড প্রতিস্থাপন ব্যবহার করে অস্থায়ী ফিফোতে প্রতিক্রিয়া সামগ্রীটি পুনর্নির্দেশের জন্য কার্লের বিকল্পটি ব্যবহার করুন এবং তারপরে সেই কমান্ড প্রতিস্থাপনের মধ্যে আউটপুটটিকে আপনার বর্তমান প্রক্রিয়াতে পুনরায় ডাইরেক্ট করুন ফাইল ডেস্ক্রিপ্টারের 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 হিসাবে এটি কাজ করে না ।


5
এটি মারাত্মক চটকদার ... এবং আমি এটি পছন্দ করি!
স্পাইল 21

3
এখন, কীভাবে, আমি আউটপুটটিকে অন্য ভেরিয়েবলে পুনর্নির্দেশ করতে পারি?
রজার ফিল্মিয়ার

1
আউটপুটটি রয়েছে STDOUT, সুতরাং আপনার নিয়মিত কমান্ডের মতোই আউটপুট কমান্ড থেকে যে কোনও জায়গায় পুনর্নির্দেশ করতে সক্ষম হওয়া উচিত। যদিও আমি এটি পরীক্ষা করিনি।
সীমানা

1
/ বিন / শি সাথে কাজ করে না।
সামক

ভাল উত্তর, আপনি কোনও সত্যিকারের ফাইলে পুনর্নির্দেশ করতে পারেন এবং শেলগুলির বহনযোগ্যতা চাইলে এটি পরে বিড়াল করতে পারেন
akostadinov



11

এটি একটি বেদনাদায়ক curl --failসীমাবদ্ধতা। থেকে man curl:

-f, --fail (HTTP) সার্ভার ত্রুটিতে চুপচাপ ব্যর্থ (কোনও আউটপুট নেই)

তবে স্ট্রাউডে নন-শূন্য রিটার্ন কোড এবং প্রতিক্রিয়া সংস্থা উভয়ই পাওয়ার কোনও উপায় নেই ।

উপর ভিত্তি করে pvandenberk এর উত্তর এবং এই অন্য খুব দরকারী কৌতুক ইত্যাদি শিখেছি , এখানে কার্যসংক্রান্ত নেই:

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 [পরিসরের মধ্যে এইচটিটিপি কোডের ক্ষেত্রে 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
আপনি কী ব্যাখ্যা করতে পারেন যে এই কোডটি কী করে এবং কীভাবে এটি ওপি দ্বারা প্রদত্ত সমস্যাটির সমাধান করে? অব্যক্ত কোড ব্যবহারকারীদের কাছে অবিশ্বস্ত এবং বিপজ্জনক হিসাবে উপস্থিত হতে পারে।
বিডব্লুড্রাকো

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

নীচের সিআরএল কমান্ডটি ব্যবহার করুন এবং এটির মতো গ্রেপ করার জন্য এটিটি পাইপ করুন:

$ কার্ল -আই-এস-এল http://example.com/v3/get_list | গ্রেপ "HTTP / 1.1"

প্রতিটি পতাকা কী করে তা এখানে:

  • -I: কেবল প্রতিক্রিয়া শিরোনাম দেখান
  • -s: নিরব - অগ্রগতি বারটি দেখায় না
  • -L: Location:শিরোনাম অনুসরণ করুন

এখানে HTTP স্থিতি কোডগুলির একটি লিঙ্ক ।

কমান্ড লাইন থেকে চালান। এই কার্লটি নিঃশব্দ মোডে চলে, যে কোনও পুননির্দেশনা অনুসরণ করে, 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যা দ্রুততর তবে এটি কোনও ওয়েব কম কমপ্লায়েন্ট এইচটিটিপি সার্ভারের সাথে ভালভাবে কাজ করতে পারে না।

 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

দয়া করে নোট করুন যে -o কার্ল ফাইলের + ফাইলের নামের পুরো পথ অনুসরণ করা দরকার। আপনি যখন কার্লের সাথে d / l ব্যবহার করেন তখন এটি আপনাকে বোধগম্য নাম কাঠামোতে ফাইল সংরক্ষণ করতে দেয়। এছাড়াও লক্ষ করুন যে -s এবং -S একসাথে ব্যবহৃত আউটপুট নিঃশব্দ করে তবে ত্রুটি দেখায় না। এছাড়াও নোট করুন যে -আর ওয়েব ফাইলের মধ্যে ফাইল টাইমস্ট্যাম্প সেট করার চেষ্টা করে।

আমার উত্তরটি @ পেভেনডেনবার্ক মূলত যা পরামর্শ দিয়েছে তার উপর ভিত্তি করে, তবে এটি কেবলমাত্র / ডিভ / নালকে নির্দেশ না করে ফাইলটি কোথাও সংরক্ষণ করে।


1

এতে আউটপুট সামগ্রী stdoutএবং HTTP স্থিতি কোডটি বিভক্ত করুন stderr:

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

যদি কেবল এইচটিটিপি স্থিতি কোডটি স্টডারারের পছন্দ হয় --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ফাইল অপ্রত্যাশিত ফলাফল হতে পারে যদি সমান্তরাল চালানো।
জাক্কো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.