HTTP durum kodu 200 değilse, cURL'nin 0'dan farklı bir exitCode ile başarısız olmasına neden olabilir miyim?


239

Hep kıvırmak bir HTTP 500 yanıtını aldığımda başarısızlık anlamına çıkış kodu (! = 0), ama bu gibi görünüyor dönüyordu varsayarak oldu değil durum.

HTTP durum kodu 200 değilse, cURL'nin 0'dan farklı bir exitCode ile başarısız olmasını sağlayabileceğim bir yol var mı? Kullanabileceğimi biliyorum -w "%{http_code}"ama bu, çıkış kodu olarak değil, STDOUT'a giriyor (ayrıca bir dosyaya değil ekrana yönlendirmek istemediğim çıktıyı yakalamakla da ilgileniyorum).

Yanıtlar:


263

curl --fail istediklerinizin bir parçası:

from man curl:

-f, --fail

(HTTP) Sunucu hatalarında sessizce (hiç çıktı yok) başarısız. Bu daha çok başarısız komutlarla daha iyi başa çıkmak için komut dosyalarının daha iyi etkinleştirilmesi için yapılır. Normal durumlarda bir HTTP sunucusu bir belge teslim edemediğinde, bunu belirten bir HTML belgesi döndürür (bu genellikle nedenini ve daha fazlasını da açıklar). Bu bayrak kıvrılmanın bunu vermesini önler ve hata 22'yi döndürür.

Bu yöntem arızaya karşı güvenli değildir ve başarılı olmayan yanıt kodlarının, özellikle kimlik doğrulama söz konusu olduğunda kaymayacağı durumlar vardır (yanıt kodları 401 ve 407).

Ancak ekrana çıkışı engeller.


2
Peki hangi kısımları yapıyor ve yapmıyor?
rogerdpack

5
@ rogerdpack tl; dr, hatalı bir yanıt algıladığında sıfırdan farklı bir değer döndürür, ancak OP'nin yanıtı yakalamasına izin vermez
rampiyon

3
Bu, HTTP 301 Kalıcı Olarak Taşıma'yı yakalamıyor. Curl hala çıkış kodu 0 verdi.
wisbucky

4
@wisbucky 301 bir hata değil, yönlendirme durum kodu. Hatalar 4xx ve 5xx durum kodlarıdır.
M. Justin,

1
@wisbucky HTTP hata kodlarında sıfırdan çıkmak ve HTTP yönlendirmelerini doğru kullanmak için ne yaptığınız hakkında ayrıntılar için bu soruyucurl -f -L görün . -L
Noah Sussman

81

Sadece kıvrılmış sayfanın içeriğini görüntülemek istiyorsanız, bunu yapabilirsiniz:

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

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

Bu, HTTP durum kodunu STDOUT'a yazarken sayfanın içeriğini STDERR'ye yazar , böylece STATUSCODE değişkenine atanabilir .


3
Yanıtı başarısızlık durumunda (200 olmayan) yazdırmak , ancak 0komut dosyasından durum dışı bir kod döndürmek istersem ne olur ?
Justin,

2
@Justin: Peki ya if [ "$statuscode" -ne 200 ]; then exit "$statuscode"; fi?
ghoti

4
@ghoti: Sadece imzasız 8 bit çıkış kodları desteklenir, böylece biraz kafa karıştırıcı olabilir.
Dennis,

3
Ah, sağ - ve kodlar 8 bit olarak sarılır, bu nedenle 404 hatası 148, 500 çıkış değeri 244 olur. :-)
ghoti

7
Hafif bir varyasyon olarak, cevap stdout'a değil stdout'a yönlendirilirken kodu bir değişkende yakalar: { code=$(curl ... as above ...); } 2>&1Hile, { ... } 2>&1olduğu gibi farklı bir kabuk üretmezken yönlendirmeyi mümkün kılar ( ... ).
Tobia

31

Bayrak kombinasyonunu kullanarak yapabildim:

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

--silent ilerleme ve hatayı gizler
hata --show- gizlenebilir hata mesajı gösterir --silent
--fail isteği başarısız olduğunda bir çıkış kodu> 0 döndürür


5
Bu sunucu cevap göstermiyor. OP değilim ama vücutta döndürülen sunucudan herhangi bir hata mesajı görmek istediğinden şüpheleniyorum. Bir --silent --show-error --faileserin yanı sıra sadece aynı -f/--fail.
atık

1
Aslında, --failçıkış kodu döndürür 22, belgelenmiş olarak .
Quolonel,

2
@wisbucky 301 bir hata değil, yönlendirme durum kodu. Hatalar 4xx ve 5xx durum kodlarıdır.
M. Justin,

4
@Wisbucky için adil olmak gerekirse, orijinal soru "eğer HTTP durum kodu 200 değilse" [...] . Daha önce hiçbir yerde "hata" yok.
ken

2
@ M.Justin Kıvrılma kılavuzuna göre: Bu yöntem başarısız güvenli değildir ve özellikle kimlik doğrulama söz konusu olduğunda başarılı olmayan yanıt kodlarının kaymayacağı durumlar vardır (yanıt kodları 401 ve 407).
Youfu

0

Evet, bunu yapmanın bir yolu var ama 3 kıvrılma seçeneği içerdiğinden açıkça görülüyor

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

Bu, başarının (0) yalnızca, son kıvrılma 2xxkoduyla kıvrılmaya son stdoutverdiğimizde ve gövdeyi alan ve herhangi bir hatanın stderr'de gösterileceğini garanti eder .

Lütfen, kıvrılma dokümantasyonunun sizi biraz şaşırtacağını unutmayın, çünkü - bazı 401 kodlar için başarısız olabilir. Doğru olmayan testlere dayanarak, en azından aynı anda --show-error ile birlikte kullanıldığında.

Şimdiye kadar bu seçeneklerle bir http-başarısı olmadığında kıvrılmaların başarılı olacağı bir durum bulamadım.


1
Bu esasen Ricardo Souza’ın cevaplarıyla aynı mı?
knocte
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.