HTTP තත්ව කේතය ප්‍රතිදානය කිරීමට කරකැවෙනවාද?


899

curlHTTP ඉල්ලීම් නිකුත් කිරීම සඳහා මම ලිනක්ස් හි විධාන රේඛාවේ භාවිතා කරමි . ප්‍රතිචාර දැක්වීමේ සිරුරු සම්මතයෙන් මුද්‍රණය කර ඇති අතර එය කදිමයි, නමුත් ප්‍රතිචාරයෙන් (404, 403 යනාදිය) HTTP තත්ව කේතය මුද්‍රණය කිරීම සඳහා වක්‍රය ලබා ගන්නේ කෙසේදැයි මට පිටුවෙන් නොපෙනේ. මෙය කළ හැකිද?


මා සම්බන්ධයෙන් ගත් කල, මට HTTP තත්ව කේතය ලබා ගන්නේ කෙසේදැයි අත්පොතෙන් දැකිය හැකිය, නමුත් -w විකල්පය ක්‍රියා නොකරයි. මම දෝෂය ඇපල් වෙත වාර්තා කර ඇත්තෙමි.
නිකොලස් බාබුලෙස්කෝ

32
මෙම -iධජය, දී මෙන් curl -i https://www.example.com/, සමහර විට ඔබට අවශ්ය දේ, අනුව වේ superuser.com/a/514798/190188
caw

ඇයි ඒ වගේ දෙයක් curl -IL http://www.example.com | grep "^HTTP\/"නැත්තේ?
St3an

1
අනාගත ආත්මයට නොවේ: ඔබට අවශ්‍ය පිළිතුර බොහෝ විට සිරිල් ඩේවිඩ්ගේ (දැනට 4 වන ස්ථානයේ)
වයිට්හෝට්ලොව් ටයිගර්

Answers:


606

HEAD ඉල්ලීම් වලට ප්‍රතිචාර දැක්වීමට වෙබ් සේවාදායකයාට හැකි නම් මෙය ඔබ වෙනුවෙන් වැඩ කළ යුතුය (මෙය සිදු නොකරනු ඇත GET):

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

මීට අමතරව, නැවත යොමුකිරීම් (3xx තත්වයන්) එකතු කිරීමට CURL ට ඉඩ දීම සඳහා -L එකතු කරන්න.


166
සැ.යු: curl -Iසමහර වෙබ් යෙදුම් සේවාදායකයන් සහ සේවාවන් සඳහා HTTP තත්ව කේතය පරීක්ෂා කිරීම ගැටළු සහගත විය හැකි HEAD HTTP ඉල්ලීමක් කරයි
ජේ ටේලර්

20
තත්ව අංකය ලබා ගැනීම සඳහා එය නල කරන්නhead -n 1|cut -d$' ' -f2
බෙනුබර්ඩ්

38
Curl's stderr නැවත හරවා යැවීමට අමතක නොකරන්න : curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2. යළි-යොමුවීම් වලින් පසු ඔබට අවසාන තත්වය අවශ්‍ය නම් කරකැවීමට -L එක් කරන්න.
ආරොන් බ්ලෙන්කුෂ්

1
HEAD ඉල්ලීමක් කිරීමෙන් පසු නැවත හරවා යැවීම අනුගමනය කිරීමෙන් යෙදුම ක්‍රමලේඛනය කර ඇති ආකාරය මත පදනම්ව සිත්ගන්නාසුලු හැසිරීමක් ඇති විය හැකිය.
ස්කොට් මැකින්ටයර්

40
curl -I -X GETGET ඉල්ලීමක් යවනු ඇත, නමුත් එකම ප්‍රතිදානය ලබා දෙන්න.
ජිගි

939

මුද්රණය කිරීමට වඩා විශේෂිත ක්රමයක් පමණක් ලබාදෙන්න HTTP තත්ත්වය කේතය වන රේඛා ඔස්සේ දෙයක්:

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

විග්‍රහ කිරීම අවශ්‍ය නොවන බැවින් ස්ක්‍රිප්ට් සමඟ වැඩ කිරීම පහසුය :-)

-Iප්‍රතිචාර පැටවීමේ කාර්ය සාධනය වැඩි දියුණු කිරීම සඳහා පරාමිතිය එකතු කළ හැකිය. මෙම පරාමිතිය බාගත කිරීමේ ප්‍රතිචාරය නොමැතිව, ප්‍රතිචාරයේ තත්වය / ශීර්ෂයන් ඉල්ලා සිටී.

සටහන: %{http_code} HTTP ගෙවීම්වල පළමු පේළියේ ප්‍රතිලාභ

එනම්:

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

63
-w "% {http_code}" යනු තත්ව කේතය මුද්‍රණය කරන බිට් ය. ශරීරයෙන් කේතය වෙන් කිරීම සඳහා ඔබට එහි නව රේඛාවක් හෝ දෙකක් එක් කළ හැකිය (-w "\ n \ n% {http_code} \ n")
ජෙෆ්රි

11
ඇවැත්නි, මේ /dev/nullකාරණය මා භාවිතා කරන curl හි වින්ඩෝස් අනුවාදයේ පවා ක්‍රියාත්මක වේ.
we වේ කෙයිම්

3
මම විශ්වාස කරන්නේ මෙය මුළු ගොනුවම / dev / null වෙත ගියත් බාගත කරන බවයි, එබැවින් විශාල ගොනු සඳහා තත්ව කේතය පරීක්ෂා කිරීම සඳහා සුදුසු නොවේ. httping -c 1 -s -G -mGET එකක් නිකුත් කරන අතර සම්පූර්ණ ගොනුව බාගත නොකරයි, නමුත් මෙම ප්‍රශ්නය විශේෂයෙන් curl ගැන බව මට වැටහී ඇත.
රෝමන්ස්ට්

46
FYI: -s= බාගැනීමේ ප්‍රගතිය පෙන්වන්න එපා, -o /dev/null= ශරීරය ප්‍රදර්ශනය නොකරන්න, -w "%{http_code}"= පිටවීමෙන් පසු stdout වෙත http ප්‍රතිචාර කේතය ලියන්න.
අජේඩි 32

1
"% {Http_code around" වටා ඇති මිල ගණන් අවශ්‍යද?
හකන් බාබා

241

ඔබට ශීර්ෂකය මෙන්ම ප්‍රති result ලය දැකීමට අවශ්‍ය නම් ඔබට වාචික විකල්පය භාවිතා කළ හැකිය:

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

29
වාචික ධජය පෙන්වා දීම සඳහා +1 අමතර තොරතුරු සපයයි. REST යෙදුම් පරීක්ෂා කිරීම සඳහා විශිෂ්ටයි.
MrOodles

8
POST ඉල්ලීම කරන විට +1 භාවිතා කිරීම ඉතා පහසුය (curl -v --data "...")
MegaTux

1
එය ඒවා විවිධ ගොනු ප්‍රතිදානයන් දෙකකට බෙදයි (http තත්ත්වය විස්තර stderr ට සහ ප්‍රතිචාර දැක්වීමේ ආයතනය
stdout

230

පහත සඳහන් දෑ කිරීමෙන් ඔබට සියලු ශීර්ෂයන්ට අමතරව තත්ව කේතය මුද්‍රණය කළ හැකිය:

curl -i http://example.org

හොඳ දෙය -iනම් එයද ක්‍රියාත්මක -X POSTවීමයි.


44
පිළිගත් පිළිතුරට වඩා හොඳය (එය HEAD ඉල්ලීමක් කරයි).
neu242

11
සමහර විට පැහැදිලි, නමුත් -iසමග වැඩ කරන්නේ ඕනෑම HTTP ක්රමය පමණක් නොව, GETසහ POST... :)
mac

4
හොඳම පිළිතුර එය ශීර්ෂක සහ ශරීරය යන දෙවර්ගයේම ප්‍රතිදානය බවට පත් කරන අතර එය ස්ක්‍රිප්ට් එකක භාවිතා කරන විට බොහෝ කාර්යයන් සඳහා සුදුසු වේ
දර්ශන නාමය

7
මෙය හොඳම පිළිතුර වන අතර -s(ප්‍රගති මීටරය හෝ දෝෂ පණිවිඩ -Sනොපෙන්වන්න ) සහ (සියල්ලට පසු දෝෂ පණිවිඩ පෙන්වන්න ) සමඟ භාවිතා කළ හැකිය
ජොනතන් හාර්ට්ලි

71

ඔබට HTTP තත්ව කේතය විචල්‍යයකින් ග්‍රහණය කර ගැනීමට අවශ්‍ය නම්, නමුත් අන්තර්ගතය STDOUT වෙත හරවා යැවීමට නම්, ඔබ STDOUT දෙකක් නිර්මාණය කළ යුතුය. ක්‍රියාවලි ආදේශනය> () සහ විධාන ආදේශනය with () සමඟ ඔබට එය කළ හැකිය .

පළමුව, 3ඔබගේ වර්තමාන ක්‍රියාවලිය වන STDOUT සමඟ ගොනු විස්තරයක් සාදන්න exec 3>&1.

ඉන්පසු, -oවිධාන ආදේශනය භාවිතා කරමින් ප්‍රතිචාර අන්තර්ගතය තාවකාලික ෆිෆෝ වෙත හරවා යැවීමට කර්ල්ගේ විකල්පය භාවිතා කරන්න, ඉන්පසු එම විධාන ආදේශනය තුළ ප්‍රතිදානය ඔබේ වර්තමාන ක්‍රියාවලියට හරවා යවන්න STDOUT ගොනු විස්තරය 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ලෙස SamK පහත අදහස් සඳහන් .


5
ඒක බරපතල සිනිඳුයි ... මම එයට කැමතියි!
spyle

3
දැන්, ප්‍රතිදානය වෙනත් විචල්‍යයකට හරවා යැවිය හැක්කේ කෙසේද?
රොජර් ෆිල්මියර්

1
ප්‍රතිදානය ක්‍රියාත්මක STDOUTවන බැවින් සාමාන්‍ය විධානයක් මෙන් ඔබ කැමති ඕනෑම තැනකට ප්‍රතිදානය හරවා යැවීමට ඔබට හැකි විය යුතුය. මම මෙය අත්හදා බැලුවේ නැත.
හීත් මායිම්

1
/ Bin / sh සමඟ ක්‍රියා නොකරයි.
SamK

හොඳ පිළිතුරක්, ඔබට නියම ගොනුවකට හරවා යැවිය හැකි අතර ඔබට ෂෙල් වෙඩි
අතේ ගෙන යා හැකි


23

තත්ව කේතය පමණි

[0]$ curl -LI http://www.example.org -o /dev/null -w '%{http_code}\n' -s
[0]$ 200

මෙම GIST වෙත සියලු ණය


15

මෙය වේදනාකාරී curl --failසීමාවකි. සිට man curl:

-f, --fail (HTTP) සේවාදායක දෝෂ මත නිශ්ශබ්දව අසමත් වන්න (ප්‍රතිදානයක් නැත)

නමුත් ශුන්‍ය නොවන ප්‍රතිලාභ කේතය සහ ප්‍රතිචාර ශරීරය යන දෙකම ලබා ගැනීමට ක්‍රමයක් නොමැත .

මත පදනම් pvandenberk ගේ පිළිතුර හා SO මත උගත් මේ අනෙක් ඉතා ප්රයෝජනවත් උපක්රමය , මෙහි සලසන වක් මගක්:

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, නමුත් curlHTTP කේතයක් [400, 600 [පරාසය තුළ 127 (භාවිතා නොකරන ප්‍රතිලාභ කේතය ) ආපසු ලබා දෙනු ඇත .


2
එකඟ විය, දෝෂ ප්‍රතිදානය දැකීමට නොහැකි වීම වෙනත් ආකාරයකින් ඉතා පහසු - අසාර්ථකත්වයේ වේදනාකාරී සීමාවකි. දෝෂ ප්‍රතිදානය නොදැක REST api අසමත් වීම හඳුනා ගන්නේ කෙසේද? එය කෙතරම් අවාසනාවන්තද යත්, කර්ල් නඩත්තු කරන්නා මුරණ්ඩු ලෙස --fail-but-show-error ලබා නොදෙන ලෙස අවධාරනය කරයි. github.com/curl/curl/issues/1978
jamshid

ප්‍රලේඛනයේ දක්වා ඇති පරිදි, එය 401 සහ 407 HTTP කේතය සඳහා ක්‍රියා නොකරයි :(
ලෝගන් Mzz

සගයකුට ස්තූතියි, මම සොයාගත්තා--fail --show-error
ලූකස් සිමොන්

11

POST ඉල්ලීමක් සඳහා, පහත සඳහන් දෑ ක්‍රියාත්මක විය:

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]'

11

මෙය url වෙත ඉල්ලීමක් යවනු ඇත, ප්‍රතිචාරයේ පළමු පේළිය පමණක් ලබා ගන්න, එය කොටස් වලට බෙදන්න සහ දෙවන එක තෝරන්න.

එහි ප්‍රතිචාර කේතය අඩංගු වේ

curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2

1
මෙම කේතය කරන්නේ කුමක්ද සහ එය OP විසින් ලබා දී ඇති ගැටලුව විසඳන්නේ කෙසේද යන්න ඔබට පැහැදිලි කළ හැකිද? පැහැදිලි නොකළ කේතය පරිශීලකයින්ට විශ්වාසදායක හා භයානක ලෙස පෙනෙනු ඇත.
bwDraco

1
අනිවාර්යෙන්ම, අපි යූආර්එල් වෙත ඉල්ලීමක් යවමු, ප්‍රතිචාරයේ පළමු පේළිය පමණක් ලබාගෙන, එය කොටස් වලට බෙදා දෙවැන්න තෝරන්න. OP සොයන ප්‍රතිචාර කේතය එහි අඩංගු වේ.
පිලිප් ස්පිරිඩොනොව්

6

පහත දැක්වෙන CURL විධානය භාවිතා කර එය grep කිරීමට පයිප්ප කරන්න:

$ curl -I -s -L http://example.com/v3/get_list | grep "HTTP / 1.1"

එක් එක් ධජය කරන දේ මෙන්න:

  • -I: ප්‍රතිචාර ශීර්ෂ පමණක් පෙන්වන්න
  • -s: නිහ nt - ප්‍රගති තීරුව පෙන්වන්න එපා
  • -L: Location:ශීර්ෂ අනුගමනය කරන්න

මෙන්න HTTP තත්ව කේත වලට සබැඳියක් .

විධාන රේඛාවෙන් ධාවනය කරන්න. මෙම වක්‍රය නිහ silent මාදිලියේ ක්‍රියාත්මක වන අතර ඕනෑම යළි-යොමුවීම් අනුගමනය කරයි, HTTP ශීර්ෂ ලබා ගන්න. grep විසින් HTTP තත්ව කේතය සම්මත ප්‍රතිදානය වෙත මුද්‍රණය කරනු ඇත.


5

මෙන්න curl විධානයක් භාවිතා කරන GETඅතර එය HTTP කේතය ලබා දෙයි.

curl -so /dev/null -w '%{response_code}' http://www.example.org

කරුණාකර පහත ප්‍රවේශය භාවිතා කරන බව මතක තබා ගන්න HEAD, එය වේගවත් නමුත් සමහර වෙබ් අඩු අනුකූල HTTP සේවාදායකයන් සමඟ එය හොඳින් ක්‍රියා නොකරනු ඇත.

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

අවම වශයෙන් OS X හි වැඩ නොකරයි.
අයින්

OS X High Sierra 10.13.6 හි මට හොඳින් වැඩ කිරීම.
බෙන් බාරොන්

5
curl -so -i /dev/null -w "%{http_code}"  http://www.any_example.com

මෙය පහත තොරතුරු ලබා දෙනු ඇත:

  1. ප්‍රතිචාර දත්ත, කිසියම් දත්තයක් API මඟින් දෝෂයක් ලෙස ආපසු ලබා දෙන්නේ නම්
  2. තත්ව කේතය

මෙය යළි-යොමුවීම් අනුගමනය නොකරයි. මෙම පවතින පිළිතුර වඩා හොඳ superuser.com/a/442395/475508
cricket_007

අනිවාර්යෙන්ම ඔබටත් එය යොමු කළ හැකිය !!
srana

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

OP හට තත්ව කේතය දැන ගැනීමට අවශ්‍යය. බොහෝ විට ගොනුවක් බාගත කිරීමේදී ඔබට එහි විශාලත්වය පිළිබඳ හැඟීමක් ලබා ගැනීමට අවශ්‍ය වන බැවින් මම මුලින්ම curl භාවිතා කරන්නේ තත්ව කේතය සහ ගොනුවේ ප්‍රමාණය පෙන්වීමට වන අතර පසුව මට අවශ්‍ය ස්ථානයට සහ නමට වාචික හා සෘජු ගොනුව වසා දමන්න:

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 in curl ගොනුවේ සම්පූර්ණ මාර්ගය + ගොනුවේ නම අනුගමනය කළ යුතු බව කරුණාවෙන් සලකන්න. මෙමඟින් ඔබ ගොනු වක්‍රාකාරව d / l කරන විට සංවේදී නාම ව්‍යුහයක් තුළ සුරැකීමට ඉඩ සලසයි. -S සහ -S එකට භාවිතා කිරීම ප්‍රතිදානය නිහ silence කරන නමුත් දෝෂ පෙන්වන බව සලකන්න. -R විසින් ගොනු ගොනුව වෙබ් ගොනුවට සැකසීමට උත්සාහ කරන බව සලකන්න.

මගේ පිළිතුර පදනම් වී ඇත්තේ @pvandenberk මුලින් යෝජනා කළ දේ මත ය, නමුත් ඊට අමතරව එය ඇත්ත වශයෙන්ම / dev / null වෙත යොමු කිරීම වෙනුවට ගොනුව කොහේ හෝ සුරකිනු ඇත.


1

ප්‍රතිදාන අන්තර්ගතය stdoutසහ HTTP තත්ව කේතය පහත පරිදි බෙදන්න stderr:

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

HTTP තත්ව කේතය පමණක් stderr ට අවශ්‍ය නම්, --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>
...

දෙවන යළි හරවා යැවීම අපේක්ෂිත පරිදි හැසිරීමට නම්, අපි curl විධානය උප අක්ෂරයෙන් ක්‍රියාත්මක කළ යුතු බව සලකන්න .


1
bashක්‍රියාවලි ආදේශ කිරීම සඳහා අවශ්‍ය වේ .
ජාකෝ

R බ un නෝ, මම උදාහරණය superuser.com/revisions/1444693/2 වෙතින් වෙනස් කළෙමි, /tmp/out /tmp/errසමාන්තරව ධාවනය වුවහොත් ලිපිගොනු අනපේක්ෂිත ප්‍රති results ල ඇති කළ හැකි යැයි මම සිතමි .
ජාකෝ
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.