Abrufen des Antwortheaders vom HTTP-POST mithilfe von Curl

561

Man kann nur die Header mit HTTP HEAD anfordern, als Option -Iin curl(1).

$ curl -I /

Lange HTML-Antwortkörper sind in der Befehlszeile nur schwer zu bekommen, daher möchte ich nur den Header als Feedback für meine POST-Anfragen erhalten. HEAD und POST sind jedoch zwei verschiedene Methoden.

Wie kann ich Curl dazu bringen, nur Antwortheader auf eine POST-Anforderung anzuzeigen?

Jonathan Allard
quelle

Antworten:

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.

und

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

und

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

von der Manpage. damit

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

folgt Weiterleitungen, speichert die Header in stdout und sendet die Daten an / dev / null (das ist ein GET, kein POST, aber Sie können dasselbe mit einem POST tun - fügen Sie einfach die Option hinzu, die Sie bereits für POST-Daten verwenden).

Beachten Sie das -nach dem, -Dwas anzeigt, dass die Ausgabe "Datei" stdout ist.

Andrew Cooke
quelle
22
Der obige Kommentar ist gültig, wenn Sie Powershell verwenden. für cmd.exe verwendencurl -s -D - http://yahoo.com -o nul
JJS
1
@JJS für mich $ null hat unter Win7 funktioniert. Liegt es daran, dass cLink unter Windows installiert ist?
Satya Prakash
17
Das "-" vor der URL mag unwichtig erscheinen, ist es aber nicht.
Wahid Sadik
1
@WahidSadik Warum ist das besonders der Fall? Was ist die Funktion des einzelnen Strichs?
Mamachanko
4
@mamachanko verwendet -Dein Argument, das besagt, wohin die Ausgabe gehen soll. Der einzelne Strich bedeutet, dass es auf stdout gehen sollte.
Andrew Cooke
172

Für die anderen Antworten muss der Antworttext heruntergeladen werden. Es gibt jedoch eine Möglichkeit, eine POST-Anforderung zu erstellen, bei der nur der Header abgerufen wird:

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

Ein -Iselbst führt eine HEAD-Anforderung aus, die überschrieben werden kann -X POST, um eine POST-Anforderung (oder eine andere Anforderung) auszuführen und dennoch nur die Header-Daten abzurufen.

Siracusa
quelle
15
Diese Antwort ist tatsächlich richtig, da Webserver je nach Anforderungsmethode unterschiedliche Header zurückgeben können. Wenn Sie Header auf GET überprüfen möchten, müssen Sie die GET-Anforderung verwenden.
Chhantyal
6
Dies ist meiner Meinung nach die richtigste Antwort. Es ist leicht zu merken, es sendet tatsächlich eine GETAnfrage und lädt nicht den gesamten Antworttext herunter (oder gibt ihn zumindest nicht aus). Die -sFlagge ist nicht notwendig.
Skozin
@ JeffPuckettII gut irgendwie nitpicking würde ich sagen. Sie können ersetzen GETmit POSTin obigem Befehl , und es wird wie erwartet. or any otherist dort der Schlüssel.
Chhantyal
18
Dies funktioniert nicht, wenn Sie tatsächlich POSTeinige Daten benötigen. Curl sagt:Warning: You can only select one HTTP request method! You asked for both POST Warning: (-d, --data) and HEAD (-I, --head).
SebastianH
2
@nickboldt Der Punkt hier ist, dass ein Server möglicherweise anders auf eine HEAD-Anforderung reagiert als auf eine POST- oder GET-Anforderung (und einige Server tun dies tatsächlich), daher -X HEADist hier keine zuverlässige Lösung.
Siracusa
58

Der folgende Befehl zeigt zusätzliche Informationen an

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

Sie können den Server bitten, nur HEAD anstelle der vollständigen Antwort zu senden

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

Note:In einigen Fällen sendet der Server möglicherweise unterschiedliche Header für Post und HEAD. In fast allen Fällen sind die Header jedoch gleich.

Zainengineer
quelle
5
Es ist bedauerlich, dass die andere Antwort gewonnen hat, da dies die richtige Antwort ist - es werden nicht unnötig viele Daten übertragen.
Daniel
1
@dmd Wenn ich das cURL-Handbuch für -X, --requestrichtig verstehe , -X HEADergibt sich immer noch "eine Menge Daten", aber es gibt -I, --headwelche, die zu dem führen sollten, was Sie erwarten.
Daniel AR Werner
1
Du verstehst es nicht richtig. -X HEADund -Isind genau gleichwertig.
Daniel
18
Problem mit -X HEADist, dass der Server möglicherweise anders reagiert, da er jetzt eine HEADAnfrage anstelle einer GET(oder was auch immer die vorherige Anfrage war) empfängt
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

Für lange Antwortkörper (und verschiedene andere ähnliche Situationen) ist die Lösung, die ich verwende, immer die Leitung zu less, also

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

oder

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

wird den Job machen.

Fiatjaf
quelle
diese sind nicht gleichwertig. Der erste gibt eine HEADAnfrage aus, auf die viele Server unterschiedlich reagieren. Der zweite gibt eine GETAnfrage heraus, die eher dem entspricht, wonach wir hier suchen.
Glasz
25

Vielleicht ist es ein bisschen extrem, aber ich benutze diese super kurze Version:

curl -svo. <URL>

Erläuterung:

-v Debug-Informationen drucken (einschließlich Header)

-o.Senden Sie Webseitendaten (die wir ignorieren möchten) an eine bestimmte Datei, .in diesem Fall an ein Verzeichnis, das ein ungültiges Ziel ist und die Ausgabe ignoriert.

-sKein Fortschrittsbalken, keine Fehlerinformationen (sonst würden Sie sehen Warning: Failed to create the file .: Is a directory)

Warnung: Ergebnis schlägt immer fehl (in Bezug auf Fehlercode, ob erreichbar oder nicht). Verwenden Sie diese Option beispielsweise nicht in bedingten Anweisungen in Shell-Skripten ...

exebook
quelle
1
Warum -o.statt verwenden -o /dev/null?
Bfontaine
@bfontaine -o.wird gegen der -o /dev/nullKürze verwendet
exebook
Es hat nicht das gleiche Verhalten, daher ist es seltsam, nur 8 Zeichen zu speichern.
Bfontaine
2
@bfontaine Es gibt andere Antworten, die zeigen, wie man das am besten macht. Diese hier ist, um die kurze Alternative zu zeigen, die im Grunde das Gleiche tut.
Exebook
Sie sollten in Ihrer Antwort klarstellen, dass dieser Befehl immer fehlschlägt. curl -svo. <url> && echo foowird nicht gedruckt, fooda -o.make curleinen Code ungleich Null (= Fehler) zurückgibt : curl: (23) Failed writing body.
Bfontaine
16

Viel einfacher - das ist es, was ich benutze, um Shortlink-Tracking zu vermeiden - ist das Folgende:

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

… Was auch Links folgt .

Kaiser
quelle
14

Während die anderen Antworten nicht in allen Situationen für mich funktioniert haben, ist die beste Lösung, die ich finden konnte (auch mit der ich arbeiten kann POST), von hier aus entnommen :

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

Daniel AR Werner
quelle
1
Ich musste die URL zwischen Anführungszeichen setzen, damit dies funktioniert.
Christophe Weis
1
Ob dies notwendig ist oder nicht, hängt möglicherweise von der URL und der verwendeten Shell ab. Ich habe die Antwort entsprechend verbessert. Vielen Dank.
Daniel AR Werner
3

headcurl.cmd (Windows-Version)

curl -sSkv -o NUL %* 2>&1
  • Ich möchte keinen Fortschrittsbalken -s.
  • aber ich will fehler -S,
  • sich nicht um gültige https-Zertifikate kümmern -k,
  • hohe Ausführlichkeit erhalten -v(hier geht es um Fehlerbehebung, oder?),
  • keine Ausgabe (auf saubere Weise).
  • oh, und ich möchte stderr an stdout weiterleiten , damit ich gegen das Ganze grep kann (da die meisten oder alle Ausgaben in stderr kommen)
  • %*bedeutet [alle Parameter an dieses Skript weitergeben] (gut ( https://stackoverflow.com/a/980372/444255 ), normalerweise ist das nur ein Parameter: die URL, die Sie testen

Beispiel aus der Praxis (zur Fehlerbehebung bei Proxy-Problemen):

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

für dein .bash_aliases/ .bash_rc:

alias headcurl='curl -sSkv -o /dev/null $@  2>&1'
Frank Nocke
quelle
Dadurch wird der Body heruntergeladen und Bandbreite und Zeit verbraucht. Die Antwort von @siracusa ( stackoverflow.com/a/38679650/6168139 ) hat diesen Overhead nicht.
Rushi
Wenn & wenn Sie POST möchten, fügen Sie -X POSTden Passthrough-Parametern hinzu. Wenn Sie GET möchten, verwenden Sie GET (dh Standard), da die Antworten unterschiedlich sein können. - Wenn Sie in Produktionsskripten nicht viel Curling machen (nicht für Diagnose und Entwicklung), ist mir ein bisschen Bandbreite egal.
Frank Nocke
Ich plane es zu sehen, ob Dateien auf dem Server aktualisiert werden oder nicht 'Last-Modified' verwenden. Die Dateien an sich sind groß, einige in GB, und ich bin normalerweise im Mobilfunk. Diese große Bandbreite ist also ein Problem für mich.
Rushi
Das wäre hacky . Ich muss das nicht tun, da Siracusas Antwort die Aufgabe genau ausführt.
Rushi