Die Kommandozeile curl kann den Antwort-Header anzeigen, indem sie -D
Option, aber ich möchte sehen, welchen Request Header er sendet. Wie kann ich das tun?
Antworten
Zu viele Anzeigen?Ein Befehl wie der folgende zeigt drei Abschnitte an: Anforderungskopfzeilen, Antwortkopfzeilen und Daten (durch CRLF getrennt). Er vermeidet technische Informationen und syntaktisches Rauschen, das von curl hinzugefügt wird.
curl -vs www.stackoverflow.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'
Der Befehl erzeugt die folgende Ausgabe:
GET / HTTP/1.1
Host: www.stackoverflow.com
User-Agent: curl/7.54.0
Accept: */*
HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: https://stackoverflow.com/
Content-Length: 149
Accept-Ranges: bytes
Date: Wed, 16 Jan 2019 20:28:56 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-bma1622-BMA
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1547670537.588756,VS0,VE105
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Set-Cookie: prov=e4b211f7-ae13-dad3-9720-167742a5dff8; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly
<head><title>Document Moved</title></head>
<body><h1>Object Moved</h1>This document may be found <a HREF="https://stackoverflow.com/">here</a></body>
Beschreibung:
-vs
- Kopfzeilen hinzufügen (-v), aber Fortschrittsbalken entfernen (-s)2>&1
- stdout und stderr zu einem einzigen stdout zusammenfassensed
- die von curl erzeugte Antwort mit den folgenden Befehlen bearbeiten/^* /d
- Zeilen, die mit '* ' beginnen, entfernen (technische Informationen)/bytes data]$/d
- Zeilen, die mit 'bytes data]' enden, entfernen (technische Informationen)s/> //
- Präfix '>' entfernens/< //
- Präfix '<' entfernen
Ich selbst musste dieses Problem bei der Fehlersuche in Webanwendungen überwinden. -v
ist großartig, aber ein wenig zu für meinen Geschmack zu langatmig. 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 -v
wird an stderr und nicht an stdout gesendet. Indem wir dies an eine Subshell umleiten, können wir sed
um Zeilen zu entfernen, die mit *
. Da die eigentliche Ausgabe nicht durch die Unterschale läuft, wird sie nicht beeinflusst. Die Verwendung einer Subshell ist etwas umständlich, aber es ist der einfachste Weg, um stderr auf einen anderen Befehl umzuleiten. (Wie ich bereits erwähnt habe, verwende ich dies nur zu Testzwecken, so dass es für mich gut funktioniert).
Wenn Sie mehr Alternativen wünschen, können Sie versuchen, einen modernen Kommandozeilen-HTTP-Client wie httpie das für die meisten Betriebssysteme mit Paketmanagern wie brew, apt-get, pip, yum usw. verfügbar ist
z.B.:- Für OSX
brew install httpie
Dann können Sie verwenden. auf der Kommandozeile mit verschiedenen Optionen
http GET https://www.google.com
Die Option -v für curl ist zu ausführlich in der Fehlerausgabe, die den führenden *
(Statuszeile) oder >
(Anforderungshauptfeld) oder <
(Antwort-Kopffeld). um nur das Anfrage-Kopffeld zu erhalten:
curl -v -sS www.stackoverflow.com 2>&1 >/dev/null | grep '>' | cut -c1-2 --complement
um nur das Kopffeld der Anfrage zu erhalten:
curl -v -sS www.stackoverflow.com 2>&1 >/dev/null | grep '<' | cut -c1-2 --complement
oder sie in /tmp/test.txt
Datei mit der Option -D
curl -D /tmp/test.txt -sS www.stackoverflow.com > /dev/null
zu filtern, um die -v
ausgeben, sollten Sie die Fehlerausgabe ins Terminal und die Standardausgabe nach /dev/null leiten, die Option -s verbietet die Fortschrittsanzeige
- See previous answers
- Weitere Antworten anzeigen
40 Stimmen
curl --head http://google.com
tut dasselbe wie die-I
Flagge :)16 Stimmen
Hinweis zur Verwendung
--head
/-I
: Nicht alle Server reagieren genau gleich aufHEAD
Anfragen (zum Beispiel,Content-Encoding
fehlen würde, wenn Sie versuchen würden, zu überprüfen, ob der Body gzipped ist) und nicht alle Server unterstützenHEAD
.-v
ist in der Regel die sicherere Wahl.5 Stimmen
Mögliches Duplikat von Wie kann ich die Anfrage-Header von curl sehen, wenn ich eine Anfrage an den Server sende?