Curl kullanarak HTTP POST'tan yalnızca yanıt üstbilgisi alma


561

Bir seçenek olarak, HTTP HEAD kullanan tek başlıklarını talep edebilirsiniz -Iiçinde curl(1).

$ curl -I /

Uzun HTML yanıt gövdeleri, komut satırına girmek için bir acıdır, bu nedenle POST isteklerim için yalnızca üstbilgiyi geri bildirim almak istiyorum. Ancak, HEAD ve POST iki farklı yöntemdir.

Bir POST isteğine yalnızca yanıt başlıklarını görüntülemek için kıvrımı nasıl alabilirim?

Yanıtlar:


773
-D, --dump-header <file>
       Write the protocol headers to the specified file.

       This  option  is handy to use when you want to store the headers
       that a HTTP site sends to you. Cookies from  the  headers  could
       then  be  read  in  a  second  curl  invocation by using the -b,
       --cookie option! The -c, --cookie-jar option is however a better
       way to store cookies.

ve

-S, --show-error
       When used with -s, --silent, it makes curl show an error message if it fails.

ve

-L/--location
      (HTTP/HTTPS) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response
      code), this option will make curl redo the request on the new place. If used together with -i/--include or -I/--head, headers from  all  requested
      pages  will  be  shown.  When authentication is used, curl only sends its credentials to the initial host. If a redirect takes curl to a different
      host, it won’t be able to intercept the user+password. See also --location-trusted on how to change this. You can limit the amount of redirects to
      follow by using the --max-redirs option.

      When curl follows a redirect and the request is not a plain GET (for example POST or PUT), it will do the following request with a GET if the HTTP
      response was 301, 302, or 303. If the response code was any other 3xx code, curl will re-send the following  request  using  the  same  unmodified
      method.

adam sayfasından. yani

curl -sSL -D - www.acooke.org -o /dev/null

yönlendirmeleri izler, başlıkları stdout'a atar ve verileri / dev / null öğesine gönderir (bu bir GET, POST değil, ancak POST ile aynı şeyi yapabilirsiniz - POSTing verileri için zaten kullandığınız seçeneği ekleyin)

Not -sonra -Dçıktı "dosya" stdout'u olduğunu gösterir.


22
powershell kullanıyorsanız yukarıdaki yorum geçerlidir. .exe kullanımı içincurl -s -D - http://yahoo.com -o nul
JJS

1
@JJS benim için $ null Win7 üzerinde çalıştı. Windows üzerinde yüklü cLink mi?
Satya Prakash

17
URL'nin önündeki "-" önemsiz görünebilir, ancak değildir.
Wahid Sadik

1
@WahidSadik Neden böyle? Tek çizginin işlevi nedir?
mamachanko

4
@mamachanko -D, çıktının nereye gitmesi gerektiğini söyleyen bir argüman alır. tek çizgi stdout'a gitmesi gerektiği anlamına gelir.
andrew cooke

172

Diğer yanıtlar, yanıt gövdesinin indirilmesini gerektirir. Ancak, yalnızca üstbilgiyi getirecek bir POST isteği yapmanın bir yolu vardır:

curl -s -I -X POST http://www.google.com

Bir -Ikendi başına -X POSTbir POST (veya başka herhangi bir) istek gerçekleştirmek için geçersiz kılınabilen ve yine de yalnızca başlık verilerini alabilen bir HEAD isteği gerçekleştirir.


15
Bu yanıt aslında doğrudur, çünkü web sunucuları istek yöntemine göre farklı başlıklar döndürebilir. GET'teki başlıkları kontrol etmek istiyorsanız, GET isteğini kullanmanız gerekir.
chhantyal

6
Bence bu en doğru cevap. Hatırlamak kolaydır, aslında GETistek gönderir ve tüm yanıt gövdesini indirmez (veya en azından çıktısını vermez). -sBayrak ne de gereklidir.
skozin

@JeffPuckettII iyi nitpicking söyleyebilirim. Yukarıdaki komut GETile değiştirebilirsiniz POSTve beklendiği gibi çalışacaktır. or any otheranahtar var.
chhantyal

18
POSTBazı verileri gerçekten istediğinizde bu çalışmaz . Curl diyor ki:Warning: You can only select one HTTP request method! You asked for both POST Warning: (-d, --data) and HEAD (-I, --head).
SebastianH

2
@nickboldt Buradaki nokta, bir sunucunun HEAD isteğine POST veya GET isteğinden (ve bazı sunucular aslında bunu yapar) farklı yanıt verebileceğidir, bu nedenle -X HEADburada güvenilir bir çözüm yoktur.
siracusa

58

Aşağıdaki komut fazladan bilgi görüntüler

curl -X POST http://httpbin.org/post -v > /dev/null

Sunucudan tam yanıt yerine yalnızca HEAD göndermesini isteyebilirsiniz

curl -X HEAD -I http://httpbin.org/

Note:Bazı durumlarda, sunucu yazı ve HEAD için farklı başlıklar gönderebilir. Ancak hemen hemen tüm durumlarda başlıklar aynıdır.


5
Diğer cevabın kazanması talihsiz bir durumdur, çünkü bu doğru cevaptır - gereksiz yere bir ton veri aktarmaz.
Daniel

1
@dmd cURL kılavuzunu -X, --requestdoğru bir şekilde anlarsam , -X HEADyine de “tonlarca veri” ile -I, --headsonuçlanır, ancak beklediğinizle sonuçlanması gereken şeyler vardır.
Daniel AR Werner

1
Doğru anlamıyorsunuz. -X HEADve -Itamamen eşdeğerdir.
Daniel

18
Sorun -X HEAD, sunucunun farklı bir şekilde yanıt verebilmesidir, çünkü şimdi (veya önceki istek ne olursa olsun) HEADyerine bir istek alırGET
Grav

4
Warning: Setting custom HTTP method to HEAD with -X/--request may not work the Warning: way you want. Consider using -I/--head instead.
Dorian

53

Uzun müdahale organları (ve diğer çeşitli benzer durumlar) için, kullandığım çözüm her zaman boru oluşturmaktır less, bu yüzden

curl -i https://api.github.com/users | less

veya

curl -s -D - https://api.github.com/users | less

işi yapacak.


bunlar eşdeğer değildir . İlki HEAD, birçok sunucunun farklı yanıt verdiği bir istek yayınlar . ikincisi GET, burada aradığımız şeye benzer bir istek yayınlar .
glasz

25

Belki biraz aşırı, ama bu süper kısa sürümünü kullanıyorum:

curl -svo. <URL>

Açıklama:

-v hata ayıklama bilgilerini yazdır (üstbilgileri içerir)

-o.web sayfası verilerini (yoksaymak istediğimiz) belirli bir dosyaya gönderir, .bu durumda, bu bir dizin ve geçersiz bir hedeftir ve çıktının yoksayılmasını sağlar.

-silerleme çubuğu yok, hata bilgisi yok (aksi halde görürdünüz Warning: Failed to create the file .: Is a directory)

uyarı: sonuç her zaman başarısız olur (ulaşılabilir veya ulaşılamıyorsa hata kodu açısından). Kabuk komut dosyasında koşullu ifadelerde kullanmayın ...


1
Neden kullanmak -o.yerine -o /dev/null?
bfontaine

@bfontaine kısaltma için -o.karşı kullanılır-o /dev/null
exebook

aynı davranışa sahip değildir, bu yüzden bunu sadece 8 karakter kaydetmek için kullanmak tuhaftır.
bfontaine

2
@bfontaine, bunun en doğru şekilde nasıl yapılacağını gösteren başka cevaplar da var, bu temelde aynı şeyi yapan kısa alternatifi göstermek için burada.
exebook

Cevabınızda bu komutun her zaman başarısız olduğunu açıklığa kavuşturmalısınız . curl -svo. <url> && echo foobaskı olmaz fooçünkü -o.yapmak curlsıfırdan farklı (= hata) kodu döndürebilir: curl: (23) Failed writing body.
bfontaine


14

Diğer cevaplar benim için her durumda işe yaramasa da, bulabildiğim en iyi çözüm (birlikte çalışarak POST) buradan alın :

curl -vs 'https://some-site.com' 1> /dev/null


1
Bu çalışmayı sağlamak için url'yi tırnak işaretleri arasına koymak zorunda kaldım.
Christophe Weis

1
Bunun gerekli olup olmadığı url'ye ve kullanılan kabuğa bağlı olabilir. Cevabı buna göre geliştirdim. Teşekkürler.
Daniel AR Werner

3

headcurl.cmd (Windows sürümü)

curl -sSkv -o NUL %* 2>&1
  • İlerleme çubuğu istemiyorum -s,
  • ama hatalar istiyorum -S,
  • geçerli https sertifikalarını rahatsız etmemek -k,
  • yüksek ayrıntıya sahip olmak -v(bu sorun giderme ile ilgili, değil mi?),
  • çıkış yok (temiz bir şekilde).
  • oh ve söylemek istiyorum iletmek Stderr için stdout (çoğu veya tüm çıkış stderr'e gelir beri) ben her şeyi karşı grep, böylece
  • %*[tüm parametreleri bu betiğe aktar] anlamına gelir (iyi ( https://stackoverflow.com/a/980372/444255 ), genellikle bu sadece bir parametredir: test ettiğiniz url

gerçek dünya örneği (proxy sorunlarını gidermede):

C:\depot>headcurl google.ch | grep -i -e http -e cache
Hostname was NOT found in DNS cache
GET HTTP://google.ch/ HTTP/1.1
HTTP/1.1 301 Moved Permanently
Location: http://www.google.ch/
Cache-Control: public, max-age=2592000
X-Cache: HIT from company.somewhere.ch
X-Cache-Lookup: HIT from company.somewhere.ch:1234

Linux sürümü

için .bash_aliases/ .bash_rc:

alias headcurl='curl -sSkv -o /dev/null $@  2>&1'

Bu, vücudu indirecek ve bant genişliği, zaman tüketecektir. @siracusa'nın cevabı ( stackoverflow.com/a/38679650/6168139 ) bu ek yüke sahip değil.
rushi

POST istiyorsanız ve POST istiyorsanız -X POST, geçiş parametrelerine ekleyin , GET istiyorsanız, yanıtlar değişebileceğinden GET (yani varsayılan) kullanın. - Üretim senaryolarında ağır kıvrılma yapmadığınız sürece (teşhis ve geliştirme için değil) Biraz bant genişliği umurumda değil.
Frank Nocke

Sunucudaki dosyaların 'Son Değiştirme' kullanılarak güncellenip güncellenmediğini görmeyi planlıyorum. Kendi içindeki dosyalar büyük, bazıları GB cinsindendir ve genellikle hücresel internet kullanıyorum. Yani, bu büyük bant genişliği benim için bir sorun.
rushi

Bu acayip olurdu . Siracusa'nın cevabı görevi doğru bir şekilde yerine getirdiğinden bunu yapmak zorunda değilim .
rushi
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.