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?

Jonathan Allard
źródło

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.

Andrzej Cooke
źródło
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.

Siracusa
źródło
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.

zainengineer
źródło
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ę.

Fiatjaf
źródło
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 ...

exebook
źródło
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
16

O wiele łatwiej - tego używam, aby uniknąć śledzenia krótkich linków - jest to:

curl -IL http://bit.ly/in-the-shadows

… Która również podąża za linkami .

kajzer
źródło
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

Daniel AR Werner
źródło
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'
Frank Nocke
źródło
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