Uzyskiwanie tylko nagłówka odpowiedzi z HTTP POST za pomocą curl


561

Można zażądać tylko nagłówków za pomocą HTTP HEAD, jako opcji -Iw curl(1).

$ curl -I /

Długie treści odpowiedzi HTML są trudne do uzyskania w wierszu polecenia, dlatego chciałbym uzyskać tylko nagłówek jako informację zwrotną dla moich żądań POST. Jednak HEAD i POST to dwie różne metody.

Jak uzyskać curl, aby wyświetlał tylko nagłówki odpowiedzi na żądanie POST?

Odpowiedzi:


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.

i

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

i

-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.

ze strony podręcznika. więc

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

podąża za przekierowaniami, zrzuca nagłówki na standardowe wyjście i wysyła dane do / dev / null (to GET, nie POST, ale możesz zrobić to samo z POST - po prostu dodaj dowolną opcję, której już używasz dla danych POST)

zwróć uwagę na -to, -Dco oznacza, że ​​wyjściowy „plik” jest stdout.


22
powyższy komentarz jest poprawny, jeśli używasz programu PowerShell. do użycia cmd.execurl -s -D - http://yahoo.com -o nul
— JJS

1
@JJS dla mnie $ null pracował na Win7. Czy wynika to z zainstalowania cLink w systemie Windows.
— Satya Prakash

17
„-” przed adresem URL może wydawać się nieważne, ale tak nie jest.
— Wahid Sadik

1
@WahidSadik Dlaczego tak jest w szczególności? Jaka jest funkcja pojedynczego myślnika?
— mamachanko

4
@machachanko -Dprzyjmuje argument, który mówi, dokąd powinien iść wynik. pojedyncza kreska oznacza, że ​​powinna ona przejść do standardowego wyjścia.
— Andrew Cooke

172

Pozostałe odpowiedzi wymagają pobrania treści odpowiedzi. Istnieje jednak sposób na wysłanie żądania POST, które pobierze tylko nagłówek:

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

-ISama wykonuje żądanie HEAD, które mogą zostać zastąpione przez -X POSTprzeprowadzić post (lub jakiegokolwiek innego) wniosek i jeszcze dostać tylko dane nagłówka.


15
Ta odpowiedź jest właściwie poprawna, ponieważ serwery WWW mogą zwracać różne nagłówki na podstawie metody żądania. Jeśli chcesz sprawdzić nagłówki w GET, musisz użyć żądania GET.
— chhantyal

6
Moim zdaniem jest to najbardziej poprawna odpowiedź. Jest łatwy do zapamiętania, w rzeczywistości wysyła GETżądanie i nie pobiera całej treści odpowiedzi (a przynajmniej jej nie wysyła). -sFlaga jest ani konieczne.
— skozin

@JeffPuckettII no cóż, nitpicking powiedziałbym. Można wymienić GETze POSTw powyższym poleceniu i będzie działać zgodnie z oczekiwaniami. or any otherjest tam kluczem.
— chhantyal

18
To nie działa, gdy faktycznie chcesz mieć POSTjakieś dane. Curl mówi:Warning: You can only select one HTTP request method! You asked for both POST Warning: (-d, --data) and HEAD (-I, --head).
— SebastianH

2
@nickboldt Chodzi tutaj o to, że serwer może reagować inaczej na żądanie HEAD niż na żądanie POST lub GET (a niektóre serwery faktycznie to robią), więc -X HEADnie ma tutaj niezawodnego rozwiązania.
— siracusa,

58

Poniższe polecenie wyświetla dodatkowe informacje

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

Możesz poprosić serwer o wysłanie tylko HEAD zamiast pełnej odpowiedzi

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

Note:W niektórych przypadkach serwer może wysyłać różne nagłówki dla postu i HEAD. Ale w prawie wszystkich przypadkach nagłówki są takie same.


5
Szkoda, że ​​wygrała inna odpowiedź, ponieważ jest to poprawna odpowiedź - nie przesyła niepotrzebnie mnóstwa danych.
— Daniel

1
@dmd Jeśli dobrze rozumiem instrukcję cURL -X, --request, -X HEADnadal otrzymuję „ masę danych”, ale jest taka, -I, --headktóra powinna skutkować tym, czego oczekujesz.
— Daniel AR Werner

1
Nie rozumiesz tego poprawnie. -X HEADi -Isą dokładnie równoważne.
— Daniel

18
Problem -X HEADpolega na tym, że serwer może reagować inaczej, ponieważ teraz otrzymuje HEADżądanie zamiast GET(lub cokolwiek poprzedniej prośby)
— 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

W przypadku ciał o długim czasie reakcji (i różnych innych podobnych sytuacjach) rozwiązaniem, którego używam, jest zawsze połączenie z rurką less, więc

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

lub

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

wykona robotę.


nie są równoważne. pierwszy wydaje HEADżądanie, na które wiele serwerów reaguje inaczej. drugi wydaje GETzapytanie, które bardziej przypomina to, czego tutaj szukamy.
— glasz

25

Może to trochę ekstremalne, ale używam tej super krótkiej wersji:

curl -svo. <URL>

Wyjaśnienie:

-v wydrukuj informacje debugowania (które zawierają nagłówki)

-o.wyślij dane strony internetowej (którą chcemy zignorować) do określonego pliku, .w tym przypadku, który jest katalogiem i jest niepoprawnym miejscem docelowym i powoduje zignorowanie danych wyjściowych.

-sbez paska postępu, bez informacji o błędach (w przeciwnym razie zobaczysz Warning: Failed to create the file .: Is a directory)

ostrzeżenie: wynik zawsze zawodzi (pod względem kodu błędu, jeśli jest osiągalny lub nie). Nie używaj, powiedzmy, instrukcji warunkowych w skryptach powłoki ...


1
Dlaczego warto korzystać -o.zamiast -o /dev/null?
— bfontaine

@bfontaine -o.jest używany w przeciwieństwie -o /dev/nulldo zwięzłości
— exebook

nie ma takiego samego zachowania, więc dziwne jest używanie go tylko do zapisywania 8 znaków.
— bfontaina

2
@bontontaine istnieją inne odpowiedzi, które pokazują, jak to zrobić w najbardziej poprawny sposób, tutaj jest tutaj, aby pokazać krótką alternatywę, która robi to samo w zasadzie.
— exebook

W odpowiedzi należy wyjaśnić, że to polecenie zawsze kończy się niepowodzeniem. curl -svo. <url> && echo foonie drukuje foobo -o.make curlzwróci niezerowy (= błąd) kod: curl: (23) Failed writing body.
— bfontaine


14

Podczas gdy inne odpowiedzi nie działały dla mnie we wszystkich sytuacjach, najlepsze rozwiązanie, jakie mogłem znaleźć (również z nimi współpracując POST), wzięte stąd :

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


1
Musiałem umieścić adres URL między cytatami, aby to zadziałało.
— Christophe Weis,

1
To, czy jest to konieczne, czy nie, może zależeć od adresu URL i używanej powłoki. Odpowiednio poprawiłem odpowiedź. Dzięki.
— Daniel AR Werner

3

headcurl.cmd (wersja dla systemu Windows)

curl -sSkv -o NUL %* 2>&1
  • Nie chcę paska postępu -s ,
  • ale chcę błędów -S ,
  • nie zawracamy sobie głowy ważnymi certyfikatami https -k ,
  • uzyskiwanie wysokiej gadatliwości -v (chodzi o rozwiązywanie problemów, prawda?),
  • brak danych wyjściowych (w czysty sposób).
  • aha, i chcę przekazać stderr do stdout , więc mogę grep na całość (ponieważ większość lub wszystkie wyjścia przychodzi stderr)
  • %*oznacza [przekaż wszystkie parametry do tego skryptu] (cóż ( https://stackoverflow.com/a/980372/444255 ), cóż, zwykle jest to tylko jeden parametr: testowany adres URL

przykład w świecie rzeczywistym (dotyczący rozwiązywania problemów z serwerem proxy):

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

Wersja Linux

dla twojego .bash_aliases/ .bash_rc:

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

Spowoduje to pobranie ciała i wykorzystanie przepustowości, czasu. Odpowiedź @siracusa ( stackoverflow.com/a/38679650/6168139 ) nie ma tego narzutu.
— rushi

Jeśli i kiedy chcesz POST, dodaj -X POSTdo parametrów przekazywania, jeśli chcesz GET, użyj GET (tj. Domyślnie), ponieważ odpowiedzi mogą się różnić. - O ile nie robisz intensywnego curlingu w skryptach produkcyjnych (nie do diagnozowania i opracowywania), nie obchodzi mnie trochę przepustowości.
— Frank Nocke,

Planuję, aby sprawdzić, czy pliki na serwerze są aktualizowane, czy nie przy użyciu „Last-Modified”. Pliki same w sobie są duże, niektóre są w GB, a ja zwykle korzystam z Internetu w sieci komórkowej. Tak więc ta duża przepustowość jest dla mnie problemem.
— rushi

To byłoby zuchwałe . Nie muszę tego robić, ponieważ odpowiedź Siracusa dokładnie wykonuje zadanie.
— rushi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.