So zeigen Sie Anforderungsheader mit Befehlszeilen-Curl an
567
Befehlszeilen-Curl kann den Antwortheader mithilfe der -DOption anzeigen , aber ich möchte sehen, welcher Anforderungsheader gesendet wird. Wie kann ich das machen?
curl --head http://google.comwird das gleiche tun wie die -IFlagge :)
Abel Terefe
9
Hinweis zur Verwendung von --head/ -I: Nicht alle Server reagieren genau gleich auf HEADAnforderungen ( Content-Encodingwürde beispielsweise fehlen, wenn Sie versuchen würden, zu überprüfen, ob der Text komprimiert wird), und nicht alle Server unterstützen HEAD. -vist normalerweise die sicherere Wahl.
Lesen Sie die Frage - dies ist für Antwortheader, nicht für Anforderungsheader
Graeme Stuart
57
Diese Antwort ist nützlich für mich, weil ich die Frage auch falsch verstanden habe.
Liam
2
Dieser Befehl ist etwas anders für Windows: curl -sD - -o NULL http://example.com
Sergey Vlasov
2
@SergeyVlasov Eigentlich ist das Äquivalent von /dev/nullin Windows nulnicht null.
Francisco Zarabozo
2
Obwohl diese Frage nach Anforderungsheadern fragt, leitet Google alle hierher, die nach Antwortheadern suchen. Wir sind alle froh, dass diese Antwort hier ist. Und diese Antwort ist die beste, um Antwort-Header zu erhalten. Vielen Dank!!!
Biomiker
96
Ich glaube, der Befehlszeilenschalter, den Sie suchen, um an Curl zu übergeben, ist -I.
Wenn Sie außerdem auf einen HTTP-Statuscode mit der Antwort 301 stoßen, möchten Sie möglicherweise auch einen -LArgumentwechsel übergeben curl, um URL-Weiterleitungen zu folgen, und in diesem Fall die Kopfzeilen aller Seiten (einschließlich der URL-Weiterleitungen) drucken (siehe Abbildung unten) ::
Die -IOption zeigt die Antwort - Header. Die Frage betraf die Anforderungsheader .
Asaph
53
Die -IOptionen bewirken, dass Curl eine ausführt HTTP HEAD, wodurch die Antwort vom Server geändert werden kann. -vIch glaube, es ist besser, einen Schalter zu verwenden .
Acw
1
Wenn Sie dies mit etwas anderem als einer HEADAnfrage (wie -X POST) versuchen und "Sie können nur eine HTTP-Anfrage auswählen!" als stackoverflow.com/questions/286982/… wird Ihnen wahrscheinlich helfen. Die Sache ist, dass -Ieine HEADAnfrage, wie acwangegeben, ausgeführt wird und wenn Ihr curlAnruf für einen weiteren Anruf eingerichtet ist, haben Sie zwei HTTP-Anfragen im curlAnruf ...
Grippe
7
Dies ist eine sehr falsche Antwort. (Ich verspreche, dass ich hier normalerweise sehr nett bin.) 1. Es macht das Gegenteil von dem, was das OP verlangt. 2. Es wird eine Anforderungsmethode HEADanstelle von GEToder verwendet POST. 3. Es sollte NIEMALS verwendet werden, um "nur die Header zu sehen", es sei denn, Sie versuchen zu sehen, wie Ihr Server anders auf a HEADals auf a reagiert GET. Es wird die meiste Zeit gleich sein, aber nicht immer. Um nur die Header zu sehen, verwenden Sie curl -o /dev/null -D /dev/stdout. Dies führt zu 100% zu den erwarteten Ergebnissen.
Bruno Bronosky
79
Die ausführliche Option ist praktisch, aber wenn Sie alles sehen möchten, was Curl bewirkt (einschließlich des übertragenen HTTP-Körpers und nicht nur der Header), empfehle ich die Verwendung einer der folgenden Optionen:
Ich glaube nicht, da es auch die Antwort-Header und den Body zeigt!
Pmpr
56
Mit dem folgenden Befehl erhalten Sie eine schöne Header-Ausgabe:
curl -L -v -s -o /dev/null google.de
-L, --location Weiterleitungen folgen
-v, --verbose Mehr Ausgabe, gibt die Richtung an
-s, --silent Zeige keinen Fortschrittsbalken
-o, --output /dev/null Empfangenen Körper nicht anzeigen
Oder die kürzere Version:
curl -Lvso /dev/null google.de
Ergebnisse in:
*Rebuilt URL to: google.de/*Trying2a00:1450:4008:802::2003...*Connected to google.de (2a00:1450:4008:802::2003) port 80(#0)> GET / HTTP/1.1>Host: google.de
>User-Agent: curl/7.43.0>Accept:*/*>< HTTP/1.1301MovedPermanently<Location: http://www.google.de/<Content-Type: text/html; charset=UTF-8<Date:Fri,12Aug201615:45:36 GMT
<Expires:Sun,11Sep201615:45:36 GMT
<Cache-Control: public, max-age=2592000<Server: gws
<Content-Length:218< X-XSS-Protection:1; mode=block
< X-Frame-Options: SAMEORIGIN
<*Ignoring the response-body
{[218 bytes data]*Connection#0 to host google.de left intact*Issue another request to this URL:'http://www.google.de/'*Trying2a00:1450:4008:800::2003...*Connected to www.google.de (2a00:1450:4008:800::2003) port 80(#1)> GET / HTTP/1.1>Host: www.google.de
>User-Agent: curl/7.43.0>Accept:*/*>< HTTP/1.1200 OK
<Date:Fri,12Aug201615:45:36 GMT
<Expires:-1<Cache-Control: private, max-age=0<Content-Type: text/html; charset=ISO-8859-1< P3P: CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info."<Server: gws
< X-XSS-Protection:1; mode=block
< X-Frame-Options: SAMEORIGIN
<Set-Cookie: NID=84=Z0WT_INFoDbf_0FIe_uHqzL9mf3DMSQs0mHyTEDAQOGY2sOrQaKVgN2domEw8frXvo4I3x3QVLqCH340HME3t1-6gNu8R-ArecuaneSURXNxSXYMhW2kBIE8Duty-_w7; expires=Sat,11-Feb-201715:45:36 GMT; path=/; domain=.google.de;HttpOnly<Accept-Ranges: none
<Vary:Accept-Encoding<Transfer-Encoding: chunked
<{[11080 bytes data]*Connection#1 to host www.google.de left intact
Wie Sie sehen können, werden curlsowohl die ausgehenden als auch die eingehenden Header ausgegeben und die Körperdaten übersprungen, obwohl Sie wissen, wie groß der Körper ist.
Zusätzlich wird für jede Zeile die Richtung angegeben, damit sie leicht lesbar ist. Ich fand es besonders nützlich, lange Weiterleitungsketten aufzuspüren.
Ich mag das besser als -vOption mit höheren Stimmen. Nur der Kürze halber kann dies auch curl -Lvso /dev/null <target>so lange odauern, bis das Ende erreicht ist.
Schrei
12
Ein Befehl wie der folgende zeigt drei Abschnitte: Anforderungsheader, Antwortheader und Daten (durch CRLF getrennt). Es vermeidet technische Informationen und syntaktisches Rauschen, das durch Curl hinzugefügt wird.
Ich musste dieses Problem beim Debuggen von Webanwendungen selbst lösen. -vist toll, aber etwas zu ausführlich für meinen Geschmack. Dies ist die (nur Bash) Lösung, die ich mir ausgedacht habe:
curl -v http://example.com/ 2> >(sed '/^*/d')
Dies funktioniert, weil die Ausgabe von -van stderr und nicht an stdout gesendet wird. Indem wir dies auf eine Unterschale umleiten, können wir seddamit Zeilen entfernen, die mit beginnen *. Da die reale Ausgabe die Subshell nicht durchläuft, ist sie nicht betroffen. Die Verwendung einer Subshell ist etwas umständlich, aber es ist der einfachste Weg, stderr zu einem anderen Befehl umzuleiten. (Wie ich bereits erwähnt habe, verwende ich dies nur zum Testen, daher funktioniert es für mich einwandfrei.)
Die Option -v für Curl ist in der Fehlerausgabe, die die führenden *(Statuszeile) oder >(Anforderungskopffeld) oder <(Antwortkopffeld) enthält, zu ausführlich . um nur das Anforderungskopffeld zu erhalten:
Um die -vAusgabe zu filtern , sollten Sie die Fehlerausgabe an das Terminal und die Standardausgabe an / dev / null leiten. Die Option -s besteht darin, die Fortschrittsmessung zu verbieten
Wenn Sie weitere Alternativen wünschen, können Sie versuchen, einen modernen Befehlszeilen-HTTP-Client wie httpie zu installieren, der für die meisten Betriebssysteme mit Paketmanagern wie Brew , Apt -Get, Pip, Yum usw. Verfügbar ist
zB: - Für OSX
brew install httpie
Dann können Sie verwenden es auf der Kommandozeile mit verschiedenen Optionen
curl --head http://google.com
wird das gleiche tun wie die-I
Flagge :)--head
/-I
: Nicht alle Server reagieren genau gleich aufHEAD
Anforderungen (Content-Encoding
würde beispielsweise fehlen, wenn Sie versuchen würden, zu überprüfen, ob der Text komprimiert wird), und nicht alle Server unterstützenHEAD
.-v
ist normalerweise die sicherere Wahl.Antworten:
curls
-v
oder--verbose
Option zeigt unter anderem die HTTP-Anforderungsheader an. Hier ist eine Beispielausgabe:quelle
Eine beliebte Antwort für die Anzeige Antwort - Header, aber OP fragte nach Anfrage - Header.
-s
: Vermeiden Sie es, den Fortschrittsbalken anzuzeigen-D -
: Header in eine Datei-
kopieren , aber an stdout senden-o /dev/null
: Antwortkörper ignorierenDies ist besser, als
-I
keineHEAD
Anfrage zu senden , was zu unterschiedlichen Ergebnissen führen kann.Es ist besser als
-v
weil du nicht so viele Hacks brauchst, um es zu lösen.quelle
curl -sD - -o NULL http://example.com
/dev/null
in Windowsnul
nichtnull
.Ich glaube, der Befehlszeilenschalter, den Sie suchen, um an Curl zu übergeben, ist
-I
.Anwendungsbeispiel:
Wenn Sie außerdem auf einen HTTP-Statuscode mit der Antwort 301 stoßen, möchten Sie möglicherweise auch einen
-L
Argumentwechsel übergebencurl
, um URL-Weiterleitungen zu folgen, und in diesem Fall die Kopfzeilen aller Seiten (einschließlich der URL-Weiterleitungen) drucken (siehe Abbildung unten) ::quelle
-I
Option zeigt die Antwort - Header. Die Frage betraf die Anforderungsheader .-I
Optionen bewirken, dass Curl eine ausführtHTTP HEAD
, wodurch die Antwort vom Server geändert werden kann.-v
Ich glaube, es ist besser, einen Schalter zu verwenden .HEAD
Anfrage (wie-X POST
) versuchen und "Sie können nur eine HTTP-Anfrage auswählen!" als stackoverflow.com/questions/286982/… wird Ihnen wahrscheinlich helfen. Die Sache ist, dass-I
eineHEAD
Anfrage, wieacw
angegeben, ausgeführt wird und wenn Ihrcurl
Anruf für einen weiteren Anruf eingerichtet ist, haben Sie zwei HTTP-Anfragen imcurl
Anruf ...HEAD
anstelle vonGET
oder verwendetPOST
. 3. Es sollte NIEMALS verwendet werden, um "nur die Header zu sehen", es sei denn, Sie versuchen zu sehen, wie Ihr Server anders auf aHEAD
als auf a reagiertGET
. Es wird die meiste Zeit gleich sein, aber nicht immer. Um nur die Header zu sehen, verwenden Siecurl -o /dev/null -D /dev/stdout
. Dies führt zu 100% zu den erwarteten Ergebnissen.Die ausführliche Option ist praktisch, aber wenn Sie alles sehen möchten, was Curl bewirkt (einschließlich des übertragenen HTTP-Körpers und nicht nur der Header), empfehle ich die Verwendung einer der folgenden Optionen:
--trace-ascii -
# stdout--trace-ascii output_file.txt
# Dateiquelle
Mit dem folgenden Befehl erhalten Sie eine schöne Header-Ausgabe:
-L, --location
Weiterleitungen folgen-v, --verbose
Mehr Ausgabe, gibt die Richtung an-s, --silent
Zeige keinen Fortschrittsbalken-o, --output /dev/null
Empfangenen Körper nicht anzeigenOder die kürzere Version:
Ergebnisse in:
Wie Sie sehen können, werden
curl
sowohl die ausgehenden als auch die eingehenden Header ausgegeben und die Körperdaten übersprungen, obwohl Sie wissen, wie groß der Körper ist.Zusätzlich wird für jede Zeile die Richtung angegeben, damit sie leicht lesbar ist. Ich fand es besonders nützlich, lange Weiterleitungsketten aufzuspüren.
quelle
-v
Option mit höheren Stimmen. Nur der Kürze halber kann dies auchcurl -Lvso /dev/null <target>
so langeo
dauern, bis das Ende erreicht ist.Ein Befehl wie der folgende zeigt drei Abschnitte: Anforderungsheader, Antwortheader und Daten (durch CRLF getrennt). Es vermeidet technische Informationen und syntaktisches Rauschen, das durch Curl hinzugefügt wird.
Der Befehl erzeugt die folgende Ausgabe:
Beschreibung:
-vs
- Kopfzeilen hinzufügen (-v), aber Fortschrittsbalken (-s) entfernen2>&1
- kombinieren Sie stdout und stderr zu einem einzigen stdoutsed
- Bearbeiten Sie die durch Curl erzeugte Antwort mit den folgenden Befehlen/^* /d
- Zeilen entfernen, die mit '*' beginnen (technische Informationen)/bytes data]$/d
- Zeilen entfernen, die mit 'Byte-Daten] enden' (technische Informationen)s/> //
- Entfernen Sie das Präfix '>'s/< //
- Entfernen Sie das Präfix '<'quelle
Ich musste dieses Problem beim Debuggen von Webanwendungen selbst lösen.
-v
ist toll, aber etwas zu ausführlich für meinen Geschmack. Dies ist die (nur Bash) Lösung, die ich mir ausgedacht habe:Dies funktioniert, weil die Ausgabe von
-v
an stderr und nicht an stdout gesendet wird. Indem wir dies auf eine Unterschale umleiten, können wirsed
damit Zeilen entfernen, die mit beginnen*
. Da die reale Ausgabe die Subshell nicht durchläuft, ist sie nicht betroffen. Die Verwendung einer Subshell ist etwas umständlich, aber es ist der einfachste Weg, stderr zu einem anderen Befehl umzuleiten. (Wie ich bereits erwähnt habe, verwende ich dies nur zum Testen, daher funktioniert es für mich einwandfrei.)quelle
Die Option -v für Curl ist in der Fehlerausgabe, die die führenden
*
(Statuszeile) oder>
(Anforderungskopffeld) oder<
(Antwortkopffeld) enthält, zu ausführlich . um nur das Anforderungskopffeld zu erhalten:um nur das Anforderungskopffeld zu erhalten:
oder um es
/tmp/test.txt
mit der Option -D in eine Datei zu kopierenUm die
-v
Ausgabe zu filtern , sollten Sie die Fehlerausgabe an das Terminal und die Standardausgabe an / dev / null leiten. Die Option -s besteht darin, die Fortschrittsmessung zu verbietenquelle
Wenn Sie weitere Alternativen wünschen, können Sie versuchen, einen modernen Befehlszeilen-HTTP-Client wie httpie zu installieren, der für die meisten Betriebssysteme mit Paketmanagern wie Brew , Apt -Get, Pip, Yum usw. Verfügbar ist
zB: - Für OSX
Dann können Sie verwenden es auf der Kommandozeile mit verschiedenen Optionen
quelle