HTTP තත්ව කේතය 200 නොවේ නම් මට 0 ට වඩා වෙනස් පිටවීමේ කේතයක් සමඟ CURL අසමත් විය හැකිද?


284

මම හැම විටම curl සඳහා HTTP 500 ප්රතිචාර ලැබුණා විට එය පිටවීම් කේතය ආපසු අදහස් අසමත් වීම (! = 0), නමුත් ඒ බව පෙනේ යැයි උපකල්පනය කරන ලදී නොවේ නඩුව.

HTTP තත්ව කේතය 200 නොවේ නම් මට 0 ට වඩා වෙනස් වූ පිටවීමේ කේතයක් සමඟ CURL අසමත් වීමට මට ක්‍රමයක් තිබේද? මට භාවිතා කළ හැකි බව මම දනිමි, -w "%{http_code}"නමුත් එය පිටවීමේ කේතය ලෙස නොව STDOUT තුළට දමයි (ඊට අමතරව, මම ගොනුවකට හරවා යැවීමට අවශ්‍ය නොවන ප්‍රතිදානය ග්‍රහණය කර ගැනීමට උනන්දු වෙමි, නමුත් තිරයට).

Answers:


301

curl --fail ඔබට අවශ්‍ය දේවලින් කොටසක් කරයි:

සිට man curl:

-f, --fail

(HTTP) සේවාදායක දෝෂ මත නිහ ly ව අසමත් වන්න (ප්‍රතිදානයක් නැත). මෙය බොහෝ දුරට සිදු කරනුයේ අසාර්ථක උත්සාහයන් සමඟ වඩා හොඳින් කටයුතු කිරීමට ස්ක්‍රිප්ට් යනාදිය වඩා හොඳින් සක්‍රීය කිරීමයි. සාමාන්‍ය අවස්ථාවන්හිදී, HTTP සේවාදායකයක් ලේඛනයක් ලබා දීමට අපොහොසත් වූ විට, එය සඳහන් කරමින් HTML ලේඛනයක් ලබා දෙයි (එය බොහෝ විට විස්තර කරන්නේ ඇයි සහ වැඩි ගණනක්). මෙම ධජය මඟින් වක්‍රය ප්‍රතිදානය කිරීමෙන් වලක්වනු ඇත.

මෙම ක්‍රමය අසාර්ථක-ආරක්ෂිත නොවන අතර සාර්ථක නොවන ප්‍රතිචාර කේත ලිස්සා යන අවස්ථා තිබේ, විශේෂයෙන් සත්‍යාපනය සම්බන්ධ වූ විට (ප්‍රතිචාර කේත 401 සහ 407).

නමුත් එය තිරයට ප්‍රතිදානය අවහිර කරයි.


3
ඉතින් එය කරන්නේ සහ නොකරන්නේ කුමන කොටස්ද?
rogerdpack

9
badrogerdpack tl; dr එය නරක ප්‍රතිචාරයක් හඳුනාගත් විට එය නොසරෝව ආපසු ලබා දෙයි, නමුත් එය ප්‍රතිචාරය ග්‍රහණය කර ගැනීමට OP ට ඉඩ නොදේ
rampion

5
මෙය HTTP 301 ස්ථිරවම ගෙනයන්නේ නැත. curl තවමත් පිටවීමේ කේතය 0 ලබා දී ඇත.
wisbucky

5
is විස්බකි 301 දෝෂයක් නොවේ, එය යළි-යොමුවීමේ තත්ව කේතය. දෝෂ 4xx සහ 5xx තත්ව කේත වේ.
එම්. ජස්ටින්

2
HTTP දෝෂ කේත මත නොසෙරෝ වෙතින් පිටවීමට සහ HTTP යළි-යොමුවීම් නිවැරදිව භාවිතා කිරීමට is විස්බකි නිවැරදිව භාවිතා කර කුමක් කරන්නේද යන්න පිළිබඳ විස්තර සඳහා මෙම ප්‍රශ්නයcurl -f -L බලන්න . -L
නෝවා සුස්මාන්

94

ඔබට කරකැවූ පිටුවේ අන්තර්ගතය ප්‍රදර්ශනය කිරීමට අවශ්‍ය නම්, ඔබට මෙය කළ හැකිය:

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

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

මෙය HTTP තත්ව කේතය STDOUT වෙත ලිවීමේදී පිටුවේ අන්තර්ගතය STDERR වෙත ලියයි, එබැවින් එය STATUSCODE විචල්‍යයට පැවරිය හැකිය .


3
අසාර්ථකත්වය පිළිබඳ ප්‍රතිචාරය (200 නොවන) ප්‍රතිදානය කිරීමට මට අවශ්‍ය නම් , නමුත් 0ස්ක්‍රිප්ට් එකෙන් තත්ව නොවන කේතයක් ලබා දෙන්න.
ජස්ටින්

2
Ust ජස්ටින්: මොකද if [ "$statuscode" -ne 200 ]; then exit "$statuscode"; fi?
ghoti

4
othhoti: සහාය නොදක්වන බිට් 8 පිටවීමේ කේත වලට පමණක් සහාය වන අතර එමඟින් ටිකක් ව්‍යාකූල විය හැකිය.
ඩෙනිස්

3
අහ්, හරි - සහ කේත බිටු 8 කින් ඔතා ඇත, එබැවින් දෝෂ 404 පිටවීමේ අගය 148 බවටත්, 500 244 බවටත් පත්වේ. :-)
ghoti

9
සුළු විචල්‍යතාවයක් ලෙස, මෙය කේතය විචල්‍යයකින් ග්‍රහණය කරගනිමින් ප්‍රතිචාරය stdout වෙත හරවා යවන අතර stderr නොවේ: { code=$(curl ... as above ...); } 2>&1උපක්‍රමය නම් { ... } 2>&1නැවත හරවා යැවීමට ඉඩ දෙන අතර වෙනත් කවචයක් නොපෙන්වයි ( ... ).
ටොබියා

40

කොඩි එකතුවක් භාවිතා කරමින් මට එය කිරීමට හැකි විය:

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

--silent ප්‍රගතිය සඟවයි සහ දෝෂය
--show-error මඟින් සැඟවී ඇති දෝෂ පණිවිඩය --silent
--fail විසින් පිටවීමේ කේතයක්> 0 ලබා දෙයි.


9
මෙය සේවාදායක පිළිතුරු නොපෙන්වයි. මම OP නොවන නමුත් ශරීරයේ නැවත ලබා දෙන සේවාදායකයෙන් කිසියම් දෝෂ පණිවිඩයක් දැකීමට ඔහුට අවශ්‍ය යැයි මම සැක කරමි. කෘතියකට අමතරව --silent --show-error --failසාධාරණ ලෙසම -f/--fail.
අපද්‍රව්‍ය

1
ඇත්තටම, --failපිටවීම් කේතය නැවත 22, ලේඛනගත ලෙස .
Quolonel ප්‍රශ්න

3
is විස්බකි 301 දෝෂයක් නොවේ, එය යළි-යොමුවීමේ තත්ව කේතය. දෝෂ 4xx සහ 5xx තත්ව කේත වේ.
එම්. ජස්ටින්

5
Is විස්බකි සමඟ සාධාරණ වීමට නම්, මුල් ප්‍රශ්නයෙහි දැක්වෙන්නේ "[...] HTTP තත්ව කේතය 200 නොවේ නම්" . මීට පෙර කොතැනකවත් "දෝෂයක්" ගැන සඳහනක් නැත.
කෙන්

2
@ එම්. ජස්ටින් කර්ල් මෑන් පිටුවට අනුව: මෙම ක්‍රමය අසාර්ථක-ආරක්ෂිත නොවන අතර සාර්ථක නොවන ප්‍රතිචාර කේත ලිස්සා යන අවස්ථා තිබේ, විශේෂයෙන් සත්‍යාපනය සම්බන්ධ වූ විට (ප්‍රතිචාර කේත 401 සහ 407).
youfu

2

මට මෑතකදී මේ වගේ දෙයක් අවශ්‍ය වූ නමුත් සෑම විටම ප්‍රතිදානය මුද්‍රණය කිරීමට මට අවශ්‍ය විය. මෙය සාක්ෂාත් කර ගැනීම සඳහා මම http_code නිස්සාරණය සහ grep භාවිතා කළෙමි.

  out=$(curl -H"Content-Type: application/json"  -w '\nstatus_code=%{http_code}\n' -s http://localhost:4040${uri} -d "${body}")
  code=$(echo ${out}|grep status_code|awk -F"=" '{print $2}')
  echo ${out}
  if [[ ${code} -ge 400 ]];
  then
    exit 2;
  fi;

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විට පමණක් වන අතර එමඟින් ශරීරය ලැබෙනු ඇති අතර ඕනෑම දෝෂයක් stderr වෙත පෙන්වනු ඇත.

කේත 401 ක් සඳහා --fail සාර්ථක විය හැකි බව සඳහන් වන නිසා curl ප්‍රලේඛනය ඔබව ටිකක් ව්‍යාකූල කළ හැකි බව කරුණාවෙන් සලකන්න. සත්‍ය නොවන පරීක්ෂණ මත පදනම්ව, අවම වශයෙන් --show-error සමඟ එකවර භාවිතා නොකරන විට.

මෙම විකල්පයන් සමඟ http- සාර්ථක නොවූ විට කර්ල් සාර්ථකත්වය ලබා දෙන කිසිදු අවස්ථාවක් සොයා ගැනීමට මට නොහැකි විය.


2
මෙය අත්‍යවශ්‍යයෙන්ම රිකාඩෝ සූසාගේ පිළිතුරමද?
knocte
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.