HTTP durum kodunun çıktısını almak için kıvrılma mı?


800

Ben kullanıyorum curlHTTP isteğinde bulunabilmesi Linux üzerinde komut satırına. Yanıt gövdeleri standart olarak basılmıştır, bu iyidir, ancak man sayfasından yanıttan HTTP durum kodunu yazdırmak için nasıl kıvrılacağımı göremiyorum (404, 403 vb.). Mümkün mü?


Bana gelince, kılavuzdan HTTP durum kodunun nasıl alınacağını görebiliyorum, ancak -w seçeneği çalışmıyor. Hatayı Apple'a bildirdim.
Nicolas Barbulesco

19
-iBayrak, olduğu gibi curl -i https://www.example.com/, sen gereği, ne istediğini muhtemelen superuser.com/a/514798/190188
gak

Neden sadece böyle bir şey değil curl -IL http://www.example.com | grep "^HTTP\/"?
St3an

Gelecek benliğe değil: İstediğiniz cevap muhtemelen Cyril David'in (şu anda 4. durumda)
WhiteHotLoveTiger

Yanıtlar:


526

Bu sizin için çalışması gerektiğini eğer web sunucusu (bu gerçekleştirmez BAŞ isteklerine yanıt yapabiliyor GET):

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

Ek olarak, cURL'nin yönlendirmeleri izlemesine izin vermek için (3xx durumları) -L ekleyin.


155
NB: curl -Ibazı web uygulama sunucuları ve servislerinin HTTP durum kodunu test etmek için sorunlu olabilecek bir HEAD HTTP talebi yapar
Jay Taylor

16
Ve sadece durum numarasını almak için, onu boruyahead -n 1|cut -d$' ' -f2
Benubird

33
Curl en stderr'yi yönlendirmek unutmayın: curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2. Yönlendirmelerden sonra son duruma ihtiyaç duyarsanız, kıvrılmak için -L ekleyin.
Aaron Blenkush

1
Yalnızca HEAD isteğinde bulunduktan sonra yönlendirmenin ardından uygulamanın nasıl programlandığına bağlı olarak ilginç davranışlara neden olabilir.
Scott McIntyre

31
curl -I -X GETbir GET isteği gönderir ancak aynı çıktıyı verir.
jiggy

835

Yalnızca HTTP durum kodunu yazdırmanın daha belirgin bir yolu, aşağıdaki satırlar boyunca bir şeydir:

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

Herhangi bir ayrıştırma gerektirmediğinden, komut dosyalarında çalışmak çok daha kolay.

-ITepki yükü performansını iyileştirmek için parametre eklenebilir. Bu parametre, indirme yanıtı gövdesi olmadan yalnızca yanıtın durumu / başlıklarını ister.

Not: %{http_code} HTTP yükünün ilk satırına geri döner

yani:

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

54
-w "% {http_code}" durum kodunu yazdıran bit. Kodu gövdeden ayırmak için içine bir ya da iki satır ekleyebilirsiniz (-w "\ n \ n% {http_code} \ n")
Jeffrey Martinez

7
Vay canına, bu /dev/nullşey kullandığım Curl Windows sürümünde bile çalışıyor.
Uwe Keim,

3
Sanırım tüm dosya / dev / null'a giderse de tüm dosyayı indirdiğine inanıyorum, bu yüzden büyük dosyaların durum kodunu kontrol etmek için ideal değil. httping -c 1 -s -G -mBir GET yayınlar ve bu sorunun özellikle curl ile ilgili olduğunu fark etmeme rağmen, tüm dosyayı indirmez.
RomanSt

40
FYI: -s= İndirme ilerlemesini gösterme, -o /dev/null= gövdeyi gösterme, -w "%{http_code}"= Çıktıktan sonra stdout'a http yanıt kodunu yaz.
Ajedi32,

1
"% {Http_code}" etrafındaki alıntılar gerekli midir?
Hakan Baba

217

Başlığın yanı sıra sonucu görmek istiyorsanız ayrıntılı seçeneğini kullanabilirsiniz:

curl -v http://www.example.org
curl --verbose http://www.example.org

Durum başlıkta görünecektir. Örneğin

< Date: Tue, 04 Nov 2014 19:12:59 GMT
< Content-Type: application/json; charset=utf-8
< Status: 422 Unprocessable Entity

26
Ayrıntılı bayrağa işaret etmek için +1, ekstra ayrıntıları sağlar. REST uygulamalarını test etmek için harika.
MrOodles

8
+1 POST isteğinde bulunurken kullanımı çok kolay (curl -v --data "...")
MegaTux

1
Hatta (Stdout'a Stderr ve tepki vücuda http durum ayrıntıları) iki farklı dosya çıktıları bunları böler
Blauhirn

201

Aşağıdakileri yaparak, tüm başlıklara ek olarak durum kodunu yazdırabilirsiniz:

curl -i http://example.org

Bunun iyi yanı -i, onunla da çalışması -X POST.


36
Kabul edilen cevaptan çok daha iyi (bir HEAD isteği yapar).
neu242

10
Belki bariz ama -ibirlikte çalışır herhangi sadece, HTTP yöntemi GETve POST:) ...
mac

3
Hem başlıkları hem de gövdeyi
kıvrık çıkarması

6
Bu en iyi cevaptır ve aşağıdakilerle birlikte kullanılabilir -s(ilerleme sayacını veya hata mesajlarını -Sgösterme ) ve (sonuçta hata mesajlarını gösterme)
Jonathan Hartley

69

HTTP durum kodunu bir değişkende yakalamak, ancak içeriği yine de STDOUT'a yönlendirmek istiyorsanız, iki STDOUT oluşturmalısınız. Bunu işlem ikame> () ve komut ikame $ () ile yapabilirsiniz .

Öncelikle, 3'STDOUT with' geçerli işleminiz için bir dosya tanıtıcısı oluşturun exec 3>&1.

Sonra, kullanım curl en -oopsiyon komut değişimini kullanarak geçici fıfo'ya tepki içeriği yönlendirmek ve daha sonra bu komut ikamesi içinde, geri akım işlem STDOUT dosya tanımlayıcı çıktı yönlendirmek 3ile -o >(cat >&3).

Hepsini bir araya getirmek bash 3.2.57(1)-release(standart 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')

Bunun, SamK'nin aşağıdaki yorumlarda belirtildiği/bin/sh gibi çalışmadığını unutmayın .


5
Bu ciddi kayganlık ... ve hoşuma gitti!
spyle 21 Ocak'ta

3
Şimdi, çıktısını başka bir değişkene nasıl yönlendirebilirim?
Roger Filmyer 12:15

1
Çıktı içeridedir STDOUT, bu nedenle çıktıyı komuttan normal bir komut gibi istediğiniz yere yönlendirebilmeniz gerekir. Bunu henüz test etmedim.
Heath Borders

1
/ Bin / sh ile çalışmaz.
SamK

iyi cevap, ayrıca gerçek bir dosyaya yönlendirebilir ve kabukları taşınabilirliği istiyorsanız daha sonra kedi
akostadinov

32

Curl çıkışını yeniden tanımla:

curl -sw '%{http_code}' http://example.org

Herhangi bir istek türüyle kullanılabilir.


-k (--insecure), (s) sessizdir.
Ravichandra


11

Bu acı verici bir curl --failsınırlamadır. Kimden man curl:

-f, --fail (HTTP) Sunucu hataları üzerinde sessiz (hiç çıkış yok) başarısız

Ama sıfırdan dönüş kodu için ikisini de bir yolu yoktur VE Stdout'a yanıt vücudu.

Pvandenberk'in cevabına ve SO'da öğrendiğim bu çok faydalı numaraya dayanarak , işte size bir geçici çözüm:

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
}

Bu işlev tam olarak davranır curl, ancak curl[400, 600 [aralığında bir HTTP kodu olması durumunda 127 (tarafından kullanılmayan bir dönüş kodu) döndürür .


Kabul edildi, hata çıktısını görememek aksi halde çok kullanışlı olan bir başarısızlık - başarısız. Hata çıktısını görmeden bir REST api hatasını nasıl teşhis edebilirsiniz? Kıvrım koruyucusu çantasının inatla ısrarla hata gösterme hatası vermemesi konusunda ısrar etmesi o kadar talihsiz bir durum. github.com/curl/curl/issues/1978
jamshid

Belgelerde belirtildiği gibi, 401 ve 407 HTTP kodu için çalışmaz :(
Logan Mzz

11

Bu, url’ye bir istek gönderecek, yanıtın yalnızca ilk satırını alacak, bloklara bölerek ikincisini seçecektir.

Yanıt kodunu içerir

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

1
Bu kodun ne yaptığını ve OP tarafından verilen soruna nasıl değindiğini açıklayabilir misiniz? Açıklanamayan kod kullanıcılar için güvenilmez ve tehlikeli görünebilir.
bwDraco

1
Elbette, url'ye bir istek gönderiyoruz, yanıtın yalnızca ilk satırını alıyoruz, bloklara bölüp ikincisini seçiyoruz. OP'nin aradığı cevap kodunu içerir.
Filip Spiridonov

9

POST isteği için aşağıdakiler işe yaradı:

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

Aşağıdaki cURL komutunu kullanın ve böyle sürtünmek için borulayın:

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

Her bayrak ne yapıyor:

  • -I: Yalnızca yanıt başlıklarını göster
  • -s: Sessiz - İlerleme çubuğunu gösterme
  • -L: Location:Başlıkları takip et

İşte HTTP durum kodlarına bir link .

Komut satırından çalıştırın. Bu kıvrılma sessiz modda çalışır, yönlendirmeleri izler, HTTP başlıklarını alır. grep, HTTP durum kodunu standart çıktıya yazdırır.


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

Bu, aşağıdaki bilgileri verecektir:

  1. Hata gibi herhangi bir veri API tarafından döndürülürse, yanıt verisi
  2. durum kodu

Bu yönlendirmeleri takip etmiyor. Bu mevcut cevap daha iyi superuser.com/a/442395/475508
cricket_007

Tabii, sen de başvurabilirsin !!
srana

4

İşte kullanan GETve HTTP kodunu döndüren bazı curl komutları .

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

Lütfen aşağıdaki yaklaşımın kullanıldığını HEAD, bunun daha hızlı olduğunu ancak bazı web uyumlu olmayan HTTP sunucularıyla iyi çalışmayabileceğini unutmayın.

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

En azından OS X üzerinde çalışmıyor.
Ain,

OS X High Sierra 10.13.6'da benim için iyi çalışıyor.
Ben Baron

4

Cevap kodlarının nasıl kullanılacağına bir örnek. Bunu Geolite veritabanlarını sadece onları değiştirdiyseniz ( -z) ve ayrıca aşağıdaki yönlendirmeleri ( -L) yeniden indirmek için kullanıyorum :

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 durum kodunu bilmek istiyor. Genellikle bir dosyayı indirirken siz de onun büyüklüğünü hissetmek istersiniz, bu yüzden öncelikle durum kodunu ve dosyanın boyutunu göstermek için curl kullanıyorum ve sonra ayrıntılı ve kapalı dosyaları istediğim yer ve adla kapatıyorum:

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

Sonra kıvrılmanın bitmesini bekliyorum

wait ${!}

Bir sonraki komutu çalıştırmadan önce. Yukarıdaki gibi birçok komut dosyasında kullanılan yukarıdaki gibi güzel bir yanıt verir:

http: 200 42824

http: 200 34728

http: 200 35452

Lütfen, curl içindeki -o dosyasının tam dosya yolu + dosya adı ile izlenmesi gerektiğini unutmayın. Bu sayede, dosyaları kıvrılarak yazarken mantıklı bir isim yapısına kaydetmenize olanak tanır. Ayrıca -s ve -S'nin birlikte kullanılmasının çıktıyı susturduğunu ancak hatalar gösterdiğini de unutmayın. Ayrıca, -R dosyasının zaman damgasını web dosyasınınkine ayarlamaya çalıştığına dikkat edin.

Cevabım @pvandenberk'in ilk başta önerdiği şeylere dayanıyor, ancak ek olarak dosyayı yalnızca / dev / null dizinine yönlendirmek yerine bir yere kaydediyor.


1

Çıktı içeriğini stdoutve HTTP durum kodunu şuna bölün stderr:

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

Stderr için sadece HTTP durum kodu isteniyorsa --silentkullanılabilir:

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

İstenilen akış, istenmeyen bir taneye yönlendirilerek toplanabilir /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>
...

Not ikinci yönlendirme olarak istenen davranmaya için, biz alt kabukta kıvırın komutunu çalıştırmak için gereken.


1
bashİşlem değişimi için gereklidir .
Jaakko

@Bruno, dosyaları paralel çalıştırıldığında beklenmeyen sonuçlara neden olabileceğini düşündüğümden superuser.com/revisions/1444693/2 adresinden örneği değiştirdim /tmp/out /tmp/err.
Jaakko
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.