প্রতিক্রিয়ার সাথে HTTP স্থিতি কোডটি ফেরত পাঠাতে কার্ল


124

আমি HTTP শিরোনাম পেতে HTTP স্থিতি কোড পেতে এবং প্রতিক্রিয়াও ফিরে পেতে কার্ল ব্যবহার করি। কমান্ডটি সহ আমি http শিরোনামগুলি পাই

curl -I http://localhost

প্রতিক্রিয়া পেতে, আমি কমান্ডটি ব্যবহার করি

curl http://localhost

-আই পতাকাটি ব্যবহার করার সাথে সাথে আমি কেবল শিরোনাম পেয়েছি এবং প্রতিক্রিয়া আর নেই। কোনও এক আদেশে http প্রতিক্রিয়া এবং শিরোনাম / HTTP স্থিতি কোড উভয়ই পাওয়ার উপায় আছে?


4
এখানে একটি খুব দরকারী স্নিপেট গিস্ট.github.com/maxcnunes/9f77afdc32df354883df
রকেটস্পেসার

উত্তর:


125

আমি কার্ল ডকটি দেখে -আউটপুট স্টাডআউট পেতে আউটপুটটি ব্যবহার করতে নির্দিষ্ট করে তা দেখে সমাধান পেতে সক্ষম হয়েছি ।

curl -o - http://localhost

কেবলমাত্র HTTP রিটার্ন কোড সহ প্রতিক্রিয়া পেতে, আমি ঠিক করতে পারি

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

19
অথবা আপনি ব্যবহার করতে চান -i। অথবা -vআপনি যদি কিছু অতিরিক্ত তথ্যও পছন্দ করেন তবে।
ড্যানিয়েল স্টেনবার্গ

4
ধন্যবাদ @ ড্যানিয়েলস্টেনবার্গ। গৃহীত উত্তরটি আমার পক্ষে কাজ করে নি, কেবল -i ব্যবহার করে।
আলেজান্দ্রো কোটিলা

আপনার দ্বিতীয় কমান্ডটি অনুপস্থিত রয়েছে -আমি @randominstanceOfLivingThing, যদি না তা ইচ্ছাকৃতভাবে একটি ফাঁকা বিকল্প না হয়? যদিও এটি ছাড়া আমার জন্য কাজ করে না
mdo123

4
-o -I-Iসিডাব্লুডিতে আক্ষরিক ' ' নামে একটি ফাইল তৈরি শেষ হয় । অন্য কেউ কি এটি দেখতে পাবে? এর সমাধানটি হল-o/dev/null -I
জেডিএস

-আই। আমি লক্ষ্য করেছি এবং এখন সংশোধন করেছি। তোমার দরকার নেই
এলোমেলোভাবে অফফ্লাইভিংথিং


41

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

12
@ ম্যাসিজেজুরেকজকো - মানটি সহজ। স্ক্রিপ্টিংয়ের উদ্দেশ্যে, এই উত্তরটি অন্য সমস্ত উত্তরগুলির মধ্যে সেরা because
সামগ্রিক

4
তবে ওপি স্পষ্টভাবে জানিয়েছে যে তারা স্থিতি কোড এবং প্রতিক্রিয়া সংস্থা উভয়ই চায় । তারা কীভাবে কীভাবে প্রতিক্রিয়া কোড পাবেন (
জবাবদিহি করেছেন

4
আমি যখনই এটি ব্যবহার করি তখনই curl -o -I -L -s -w "%{http_code}" http://localhostএকটি ফাইল তৈরি করা হয় -I, -o/dev/nullcurl -o /dev/null -I -L -s -w "%{http_code}" http://localhost
এটির

হেড সর্বদা অনুরোধ হিসাবে একই আউটপুটে ফলাফল দেয় না তবে তারা কীভাবে প্রতিক্রিয়া জানায় তা সার্ভারের মধ্যে রয়েছে। সুতরাং এটি আসলে কোনও উত্তর নয়।
এডি

32

আমি এই প্রশ্নটি খুঁজে পেয়েছি কারণ আমি ব্যবহারকারীর জন্য কিছু ত্রুটি পরিচালনা করার জন্য প্রতিক্রিয়া এবং সামগ্রী দুটি চেয়েছিলাম wanted

আপনি স্টাডি আউট করতে 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 কি? আমি এটি বুঝতে পারি না, আরও ব্যাখ্যা প্লিজ দরকার
আলেকজান্ডার মিলস

উপরে স্পষ্ট করে বলা হয়েছে, এটি HTTP স্থিতি কোড - ডেভেলপার.মোজিলা.অর্গ
এডি

28

-iবিকল্প এক যে আপনি চান হল:

curl -i http://localhost

-i, - আউটপুটে প্রোটোকল শিরোনাম অন্তর্ভুক্ত করুন (এইচ / এফ)

বিকল্পভাবে আপনি ভার্বোস বিকল্পটি ব্যবহার করতে পারেন:

curl -v http://localhost

-v, --verbose অপারেশনটিকে আরও আলোচনামূলক করুন


এর সাথে একটি গ্যাচা -iরয়েছে যা আপনি কখনও কখনও আউটপুটগুলিতে এইচটিটিপি প্রতিক্রিয়া কোডের দুটি সেট পাবেন যেমন HTTP/1.1 100 Continueশিরোনাম পরে একটি HTTP/1.1 200 OKশিরোনাম পরে । আপনি এই প্রত্যাশা প্রক্রিয়াটি অক্ষম করতে পারেন দেখুন gms.tf/when-curl-sends-100-continue.html
shuckc

17

আমি এটি ব্যবহার করেছি:

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

এইচটিটিপি স্থিতি পেতে

    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}"

কমা বিচ্ছিন্ন শরীর এবং স্থিতি পাবেন; এগুলি বের করার জন্য আপনি তাদের বিভক্ত করতে পারেন।

আপনি পছন্দ মতো ডিলিমিটার পরিবর্তন করতে পারেন।


4
ভাল ইঙ্গিত! আউটপুট সামনে স্থিতি কোড যুক্ত করা সম্ভব?
সাইকোজোকিক

8

স্থিতি কোডটি "AND" কে পুনরুদ্ধার করার উপায় এবং এটি একটি সঠিক জাসন বা আপনার কাছে যে কোনও ফর্ম্যাট কাজ করে সেটিকে ফর্ম্যাট করে। কেউ কেউ তর্ক করতে পারে এটি রাইট ফর্ম্যাট বিকল্পটির ভুল ব্যবহার তবে এটি আমার পক্ষে কাজ করে যখন আমার স্ক্রিপ্টগুলিতে স্থিতি কোড পরীক্ষা করতে এবং সার্ভার থেকে প্রতিক্রিয়াগুলি রিলে করতে আমার উভয় শরীর এবং স্থিতি কোড প্রয়োজন।

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

উপরের কোডটি চালান এবং আপনার এই ফর্ম্যাটটিতে একটি জেসন ফিরে পাওয়া উচিত:

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

-w লেখার বিন্যাস বিকল্পের সাথে, যেহেতু স্টার্ডার প্রথমে মুদ্রিত হয়, আপনি আপনার আউটপুটটি var http_code দিয়ে ফর্ম্যাট করতে পারেন এবং প্রতিক্রিয়ার মূলটিকে একটি মান (দেহ) এ স্থাপন করতে পারেন এবং var stdout ব্যবহার করে এনক্লোজিং অনুসরণ করতে পারেন। তারপরে আপনার স্টডার আউটপুটটিকে স্টডআউটে পুনর্নির্দেশ করুন এবং আপনি একটি পরিষ্কার আউটপুটে http_code এবং প্রতিক্রিয়া বডি উভয়কে একত্রিত করতে সক্ষম হবেন


4
নিম্নলিখিত ত্রুটিটি পেয়েছেন - curl: unknown --write-out variable: 'stderr'এবংcurl: unknown --write-out variable: 'stdout'
ALex_hha

curl.haxx.se/docs/manpage.html ম্যান পেজ চলক উপলব্ধ উপলব্ধ। স্টাডার কেন আপনার কার্ল দ্বারা স্বীকৃত নয় তা নিশ্চিত নন, একটি ম্যাকবুকে কার্ল আইএম। এই লিনাক্স কার্ল ডক, কম্পিউটারহোপ. com/unix/curl.htm থেকে আমি স্ট্যাডারকে ভেরিয়েবল হিসাবে দেখতে পাচ্ছি না। সম্ভবত এটি একটি ওএস প্রকরণ।
হুই ট্রান

শুধুমাত্র ইস্যু আমি এই সাথে থাকে, তাহলে আপনি শরীর যেমন যদি তার JSON, শরীর অবৈধ JSON উপরে JSON প্রতিক্রিয়া করতে হবে যেমন উদ্ধৃতি চিহ্ন, রয়েছে
theannouncer

4
যথেষ্ট পরিমাণে @ তত্ত্বাবধায়ক, আমি আশা করব দেব সেই অনুযায়ী সামঞ্জস্য করবেন কারণ সমস্ত প্রতিক্রিয়া মানক জসন নয়। প্রতিক্রিয়ার প্রকৃতির কারণে আমাকে কয়েকটি সামঞ্জস্য করতে হয়েছিল।
হুই ট্রান

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,
  ...
}

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) stdout- এ ( -) (দেখুন --dump-headerমধ্যে মানুষ কার্ল )।

আইএমএইচওও এই প্রসঙ্গে খুব সহজ:

আমি প্রায়শই সেই জসন ডেটা (যেমন কিছু বিশ্রামের এপিআই থেকে) ফর্ম্যাটেড পেতে jq ব্যবহার করি । তবে যেমন জেকিউ এইচটিটিপি শিরোনামের প্রত্যাশা করে না, কৌশলটি হ'ল স্ট্যাডার ব্যবহার করে শিরোনামগুলি মুদ্রণ করা -D/dev/stderr। নোট করুন যে এবার আমরা -sSঅগ্রগতি মিটারটি দমন করতে (- নিঃশব্দ, - শো-ত্রুটিগুলি )ও ব্যবহার করি (কারণ আমরা পাইপে লিখি)।

$ 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সন্ধান করুন Yes হ্যাঁ: বেশিরভাগ এইচটিটিপি সার্ভারের জন্য এটি একই ফল দেবে But তবে আমি প্রচুর ব্যবসায়িক অ্যাপ্লিকেশনগুলি জানি যা অনুরোধটি মোটেও প্রয়োগ করে না; -পিHEAD


1

শেষে "http_code: 200" একটি লাইন যুক্ত করুন এবং তারপরে "http_code:" কীওয়ার্ডটির জন্য গ্রেপ করুন এবং প্রতিক্রিয়া কোডটি বের করুন।

result=$(curl -w "\nhttp_code:%{http_code}" http://localhost)

echo "result: ${result}"   #the curl result with "http_code:" at the end

http_code=$(echo "${result}" | grep 'http_code:' | sed 's/http_code://g') 

echo "HTTP_CODE: ${http_code}"  #the http response code

এই ক্ষেত্রে, আপনি এখনও কার্ল প্রতিক্রিয়া বডি হিসাবে অনুরোধ সম্পর্কে আরও তথ্য পেতে নন-সাইলেন্ট মোড / ভার্বোজ মোড ব্যবহার করতে পারেন।


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

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