Yanıtla birlikte http durum kodunu döndürmek için Curl


119

Http durum kodunu bulmak ve ayrıca yanıt döndürmek için http başlıklarını almak için curl kullanıyorum. Http başlıklarını şu komutla alıyorum

curl -I http://localhost

Cevabı almak için şu komutu kullanıyorum

curl http://localhost

-I bayrağını kullanır kullanmaz, yalnızca başlıkları alıyorum ve yanıt artık orada değil. Tek bir komutta hem http yanıtını hem de üstbilgileri / http durum kodunu almanın bir yolu var mı?


Yanıtlar:


116

-Çıktıyı stdout'a almak için çıktının kullanılmasını belirten curl belgesine bakarak bir çözüm elde edebildim .

curl -o - http://localhost

Yanıtı sadece http dönüş kodu ile almak için, sadece yapabilirdim

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

15
ya da kullanırdın -i. Ya da belki -vek bilgilerden hoşlanıyorsanız.
Daniel Stenberg

2
Teşekkürler @DanielStenberg. Kabul edilen cevap benim için işe yaramadı, sadece -i ile çalıştım.
Alejandro Cotilla

kasıtlı olarak boş bir seçenek olmadığı sürece ikinci komutunuzda -I @randominstanceOfLivingThing eksik? O olmadan benim için işe yaramaz
mdo123

2
-o -I-ICWD'de kelimenin tam anlamıyla ' ' adlı bir dosya oluşturur . Bunu başka gören var mı? Bunun çözümü-o/dev/null -I
JDS

-I kaldırıldı. Şimdi fark ettim ve düzelttim. -I'ye ihtiyacınız yok.
randominstanceOfLivingThing


39

Durum kodunu başka bir çıktı olmadan yazdırmak için bu komutu kullanıyorum. Ek olarak, yalnızca bir HEAD isteği gerçekleştirecek ve yeniden yönlendirmeyi takip edecektir (sırasıyla-I ve -L).

curl -o -I -L -s -w "%{http_code}" http://localhost

Bu, bir sağlık komut dosyasındaki durum kodunu kontrol etmeyi çok kolaylaştırır:

sh -c '[ $(curl -o -I -L -s -w "%{http_code}" http://localhost) -eq 200 ]'

5
Bu zaten bir yıl önce cevaplandı. Cevabınız hangi yeni değeri getiriyor? Ayrıca lütfen cevabınıza bir açıklama yazın.
Maciej Jureczko 01

11
@MaciejJureczko - Değer basit. Komut dosyası oluşturma amacıyla, bu cevap diğer tüm cevaplar arasında en iyisidir, çünkü söz konusu durum koduyla birlikte birçok çöp satırı yerine tek bir durum kodu verir.
aggregate1166877

2
Ancak OP, özellikle hem durum kodunu hem de yanıt birimini istediklerini belirtir . Cevap kodunu nasıl alacaklarını biliyorlar (soruda belirtilmiştir)
wottle

2
Bunu her kullandığımda curl -o -I -L -s -w "%{http_code}" http://localhostçağrılan bir dosya yaratılır -I, bunun üstesinden gelmek için dosya çıktısının -ogitmesi için ima edilen bir yer ekledim , yani /dev/null:curl -o /dev/null -I -L -s -w "%{http_code}" http://localhost
Thismatters

HEAD, sunucuya nasıl yanıt verdiklerine bağlı olarak her zaman istekle aynı çıktıyla sonuçlanmayacaktır. Yani bu gerçekten bir cevap değil.
Eddie

28

Bu soruyu buldum çünkü kullanıcı için bazı hata işlemleri eklemek için HEM yanıtı ve içeriği istedim.

Çıktı almak için HTTP durum kodunu yazdırabilir ve içeriği başka bir dosyaya yazabilirsiniz.

curl -s -o response.txt -w "%{http_code}" http://example.com

Bu, yanıtın işlemeye değer olup olmadığına karar vermek için mantığı kullanmanıza izin verir.

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 nedir? Bunu anlamıyorum, lütfen daha fazla açıklamaya ihtiyacım var
Alexander Mills

yukarıda açıklandığı üzere, HTTP Durum kodunu ifade eder - developer.mozilla.org/en-US/docs/Web/HTTP/Status
Eddie

24

-iSeçenek İstediğiniz biridir:

curl -i http://localhost

-i, --include Protokol başlıklarını çıktıya dahil et (H / F)

Alternatif olarak ayrıntılı seçeneğini de kullanabilirsiniz:

curl -v http://localhost

-v, --verbose İşlemi daha konuşkan hale getirin


16

Bunu kullandım:

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

HTTP durumunu almak için

    http_status=$(echo "$request_cmd" | grep HTTP |  awk '{print $2}')
    echo $http_status

Cevap bedenini almak için bunu kullandım

    output_response=$(echo "$request_cmd" | grep body)
    echo $output_response

8

Bu komut

 curl http://localhost -w ", %{http_code}"

virgülle ayrılmış gövde ve durumu alır; onları çıkarmak için bölebilirsiniz.

Sınırlayıcıyı istediğiniz gibi değiştirebilirsiniz.


2
iyi ipucu! Çıktının önüne durum kodu eklemek mümkün müdür?
Psychozoic

6

Programlı kullanım için aşağıdakileri kullanıyorum:

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

Aşağıdaki çıktıyı gösterir:

statuscode : 200
exitcode : 0
body : {
  "login": "tj",
  "id": 25254,
  ...
}

5

Bu, durum kodunu "VE" gövdesini almanın ve onu uygun bir json veya sizin için uygun olan formatta biçimlendirmenin bir yoludur. Bazıları bunun yanlış yazma biçimi seçeneği olduğunu iddia edebilir, ancak bu, durum kodunu kontrol etmek ve sunucudan gelen yanıtları geri aktarmak için komut dosyalarımda hem gövde hem de durum koduna ihtiyacım olduğunda işe yarar.

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

yukarıdaki kodu çalıştırın ve bu formatta bir json almalısınız:

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

-w yazma biçimi seçeneğiyle, stderr önce yazdırıldığından, çıktınızı var http_code ile biçimlendirebilir ve yanıtın gövdesini bir değere (gövde) yerleştirebilir ve var stdout kullanarak kapsamı takip edebilirsiniz. Daha sonra stderr çıktınızı stdout'a yönlendirin ve hem http_code hem de yanıt gövdesini düzgün bir çıktıda birleştirebilirsiniz.


1
Aşağıdaki hatayı curl: unknown --write-out variable: 'stderr'curl: unknown --write-out variable: 'stdout'
aldım

curl.haxx.se/docs/manpage.html kılavuz sayfası, mevcut değişkeni gösterir. stderr'in kıvrımınız tarafından neden tanınmadığından emin değilim, bir macbook'taki curl im. Bu Linux curl belgesinde, computerhope.com/unix/curl.htm , stderr'i de bir değişken olarak görmüyorum. Belki de bu bir işletim sistemi varyasyonudur.
Huy Tran


Yeterince adil @ theannouncer, tüm yanıtlar standart json olmayacağından, geliştiricinin buna göre ayar yapmasını beklerdim. Yanıtın doğası gereği ayarlamam gereken bazı durumlar vardı.
Huy Tran

2

Bunu başarma yolum :

Her ikisini de (başlık ve gövde) elde etmek için genellikle şu şekilde gerçekleştiririm 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"]}

Bu başlıkları (dökümü olacak -DStdout'a) ( -için) (Bak --dump-headeriçinde adam kıvrılma ).

IMHO da bu bağlamda çok kullanışlıdır:

Bu json verilerini (örn. Bazı dinlenme API'lerinden) biçimlendirmek için genellikle jq kullanırım . Ancak jq bir HTTP başlığı beklemediğinden, işin püf noktası kullanarak başlıkları stderr'e yazdırmaktır -D/dev/stderr. Bu sefer -sSilerleme ölçeri bastırmak için (--silent, --show-errors) kullandığımızı unutmayın (çünkü bir boruya yazıyoruz).

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

Sanırım bu, başlıkları konsola yazdırmak (hızlı inceleme için) ancak gövdeyi bir dosyaya yeniden yönlendirmek istiyorsanız (örneğin, terminalinizi karıştırmamak için bir tür ikili dosya olduğunda) kullanışlı olabilir:

$ 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

Dikkat edin: Bu aynı DEĞİLDİR curl -I <url>! Bir -Iistek yerine bir HEADistek gerçekleştireceği gibi GET(Look --headin man curl . Evet: Çoğu HTTP sunucusu için bu aynı sonucu verecektir. Ancak, HEADisteği hiç uygulamayan birçok iş uygulaması biliyorum;


0

Sonuna bir "http_code: 200" satırı ekleyin ve ardından "http_code:" anahtar kelimesi için grep ekleyin ve yanıt kodunu çıkarın.

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

Bu durumda, curl yanıt gövdesi gibi istek hakkında daha fazla bilgi almak için sessiz olmayan modu / ayrıntılı modu kullanmaya devam edebilirsiniz.


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

1
Bunu neden bir süre döngüsüne koydunuz? Lütfen cevabınızı genişletin ve açıklayın.
Uberhumus
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.