Curl zur Ausgabe des HTTP-Statuscodes erhalten?

737175
kdt

Ich verwende curldie Befehlszeile unter Linux, um HTTP-Anforderungen auszugeben. Die Antwortkörper werden standardmäßig gedruckt, was in Ordnung ist, aber ich kann auf der Manpage nicht sehen, wie man den HTTP-Statuscode aus der Antwort durch curl (404, 403 usw.) drucken kann. Ist das möglich?

626
Ich kann im Handbuch sehen, wie der HTTP-Statuscode abgerufen wird. Die Option -w funktioniert jedoch nicht. Ich habe den Fehler an Apple gemeldet. Nicolas Barbulesco vor 9 Jahren 0
Das `-i`-Flag, wie in` curl -i https: // www.example.com / `, ist wahrscheinlich das, was Sie wollen, wie in https://superuser.com/a/514798/190188 caw vor 7 Jahren 10

15 Antworten auf die Frage

672
pvandenberk

Eine spezifischere Möglichkeit, nur den HTTP-Statuscode auszudrucken, sieht folgendermaßen aus:

curl -s -o /dev/null -w "%" http://www.example.org/ 

Es ist viel einfacher mit Skripten zu arbeiten, da keine Analyse erforderlich ist :-)

Der Parameter -I kann hinzugefügt werden, um die Antwortlastleistung zu verbessern. Dieser Parameter fordert nur Status / Header der Antwort an, ohne den Antworttext des Downloads. (% wird in der ersten Zeile der HTTP-Nutzdaten zurückgegeben.)

dh:

curl -s -o /dev/null -I -w "%" http://www.example.org/ 
-w "% " ist das Bit, das den Statuscode ausgibt. Sie können einen oder zwei Zeilenumbrüche hinzufügen, um den Code vom Rumpf zu trennen (-w "\ n \ n% \ n"). Jeffrey Martinez vor 10 Jahren 44
Wow, dieses `/ dev / null`-Ding funktioniert sogar in der Windows-Version von curl, die ich verwende. Uwe Keim vor 9 Jahren 4
Ich glaube, dass hier die gesamte Datei heruntergeladen wird, obwohl alles nach / dev / null geht, also nicht ideal, um den Statuscode auf große Dateien zu überprüfen. `httping -c 1 -s -G -m` gibt ein GET aus und lädt nicht die gesamte Datei herunter, obwohl mir klar ist, dass es sich bei dieser Frage speziell um curl handelt. RomanSt vor 8 Jahren 3
@romkyns, du hast recht: Die erste Variante in meiner Antwort lädt die gesamte Datei herunter und speichert sie in `/ dev / null ', aber die zweite Variante - dh. derjenige, der die "-I" -Option für "curl" verwendet, tut dies nicht. Es muss jedoch vorsichtig vorgegangen werden, da Sie nicht wirklich die gleiche Aktion testen: Einer führt eine HTTP-Anforderung "GET" aus, während der andere eine "HEAD" -Anfrage stellt , auch wenn die angeforderte URL genau gleich ist! pvandenberk vor 8 Jahren 0
FYI: `-s` = Downloadfortschritt nicht anzeigen,` -o / dev / null` = Körper nicht anzeigen, -w "% " `= = Nach dem Beenden http-Antwortcode in stdout schreiben. Ajedi32 vor 8 Jahren 21
... und `-I` = * Nur Dokumentinformationen anzeigen * Madbreaks vor 8 Jahren 0
Sind die Anführungszeichen um "% " erforderlich? Hakan Baba vor 6 Jahren 0
Ich musste '-LI' param kurz vor der URL hinzufügen, um den letzten Status nach einer Weiterleitung und nicht die '302' (basierend auf der @ Mahatmanich-Antwort) korrekt abrufen zu können: curl -s -o / dev / null -w "% " -LI http://www.example.org/ Maksym vor 6 Jahren 0
Wie Maksym bemerkt hat, müssen Sie '-L' hinzufügen, um Weiterleitungen zu folgen. Andernfalls lautet Ihr Statuscode einfach 302, wenn Sie auf eine Seite stoßen, die mit einer 301 oder 302 verschoben wurde. dragon788 vor 6 Jahren 0
391
pberlijn

Dies sollte für Sie funktionieren, wenn der Webserver auf HEAD-Anforderungen reagieren kann (dies führt nicht zu einem GET):

curl -I http://www.example.org 

Damit cURL Umleitungen (3xx-Status) folgen kann, fügen Sie -L hinzu.

Hinweis: `curl -I` führt eine HEAD-HTTP-Anforderung aus, die beim Testen des HTTP-Statuscodes für einige Webanwendungsserver und -dienste problematisch sein kann Jay Taylor vor 12 Jahren 123
Um nur die Statusnummer zu erhalten, leiten Sie sie an 'head -n 1 | cut -d $' '-f2' Benubird vor 11 Jahren 14
Vergessen Sie nicht, curl's stderr umzuleiten: `curl -I http://www.example.org 2> / dev / null | Kopf -n 1 | cut -d $ '' -f2 '. Fügen Sie -L zu curl hinzu, wenn Sie nach Umleitungen den endgültigen Status benötigen. Aaron Blenkush vor 10 Jahren 22
Wenn Sie nach der Weiterleitung nur eine HEAD-Anforderung ausführen, kann dies je nach Programmierung der App zu interessantem Verhalten führen. Scott McIntyre vor 9 Jahren 0
`curl -I -X GET` sendet eine GET-Anforderung, gibt jedoch die gleiche Ausgabe aus. jiggy vor 8 Jahren 16
Hier sind zwei Arbeitsbeispiele für GET und HEAD - http://superuser.com/a/1092635/3004 sorin vor 8 Jahren 0
Das Weiterleiten von stderr an / dev / null ist nicht erforderlich, wenn Sie nur den Fortschrittsbalken unterdrücken möchten. Verwenden Sie dazu die Option -s. galva vor 7 Jahren 0
Nicht nützlich, um Dienste zu testen, die Statuscodes für andere Methoden als GET zurückgeben. Wie REST-Dienste. Keith Tyler vor 7 Jahren 0
Dieser Befehl zeigt nur einige Informationen. Ich kann meine Antwort nicht sehen. "-i" kann besser sein. Emerald214 vor 6 Jahren 0
182
Enrico Susatyo

Wenn Sie sowohl die Kopfzeile als auch das Ergebnis sehen möchten, können Sie die verbose-Option verwenden:

curl -v http://www.example.org curl --verbose http://www.example.org 

Der Status wird in der Kopfzeile angezeigt. Z.B

< Date: Tue, 04 Nov 2014 19:12:59 GMT < Content-Type: application/json; charset=utf-8 < Status: 422 Unprocessable Entity 
+1 für das Aufzeigen der Verbose-Flagge liefert die zusätzlichen Details. Ideal zum Testen von REST-Apps. MrOodles vor 12 Jahren 22
Sehr einfach zu benutzen, wenn Sie eine POST-Anforderung ausführen (curl -v --data "...") MegaTux vor 10 Jahren 8
Sie teilt sie sogar in zwei verschiedene Dateiausgaben auf (http-Statusdetails zu stderr und Antwort-Body zu stdout). Blauhirn vor 6 Jahren 1
157
Cyril David

You can print the status code, in addition to all the headers by doing the following:

curl -i http://example.org 

The good thing about -i is that it works with -X POST as well.

Viel besser als die akzeptierte Antwort (die eine HEAD-Anfrage macht). neu242 vor 10 Jahren 23
Vielleicht offensichtlich, aber "-i" funktioniert mit ** jeder ** HTTP-Methode, nicht nur "GET" und "POST" ... :) mac vor 10 Jahren 7
Die beste Antwort, da die curl-Ausgabe sowohl Header als auch Body darstellt, sodass sie für die meisten Aufgaben geeignet ist, wenn sie in einem Skript verwendet werden Sarge Borsch vor 9 Jahren 2
Dies ist die beste Antwort und kann in Verbindung mit `-s` (Fortschrittsanzeige oder Fehlernachrichten nicht anzeigen) und` -S` (Fehlermeldungen immerhin anzeigen) verwendet werden. Jonathan Hartley vor 7 Jahren 2
50
Heath Borders

Wenn Sie den HTTP-Statuscode in einer Variablen erfassen und den Inhalt dennoch zu STDOUT umleiten möchten, müssen Sie zwei STDOUTs erstellen. Sie können dies mit der Prozessersetzung> () und der Befehlsersetzung $ () tun .

Erstellen Sie zunächst einen Dateideskriptor 3für Ihren aktuellen Prozess 'STDOUT mit exec 3>&1.

Dann die Nutzung curl -oOption, um den Antwortinhaltes in einen temporären Fifo mit dem Befehl Substitution und dann innerhalb dieses Befehls Substitution, umleiten Ausgabe zurück zu Ihrem aktuellen Prozess STDOUT Dateideskriptors zu umleiten 3mit -o >(cat >&3).

Alles zusammen in bash 3.2.57(1)-release(Standard für macOS):

#creates a new file descriptor 3 that redirects to 1 (STDOUT) exec 3>&1  # Run curl in a separate command, capturing output of -w "%" into HTTP_STATUS # and sending the content to this command's STDOUT with -o >(cat >&3) HTTP_STATUS=$(curl -w "%" -o >(cat >&3) 'http://example.com') 

Beachten Sie, dass dies nicht funktioniert, /bin/shda SamK in den Kommentaren unten angegeben ist .

Das ist eine ernsthafte Slickery ... und ich mag es! spyle vor 9 Jahren 3
Wie kann ich nun die Ausgabe auf eine andere Variable umleiten? Roger Filmyer vor 9 Jahren 3
Die Ausgabe befindet sich in `STDOUT`, daher sollten Sie in der Lage sein, die Ausgabe des Befehls an einen beliebigen Ort wie einen regulären Befehl umzuleiten. Ich habe das allerdings nicht getestet. Heath Borders vor 9 Jahren 1
Funktioniert nicht mit / bin / sh. SamK vor 6 Jahren 0
28
Grzegorz Luczywo

Lockenausgabe neu definieren:

curl -sw '%' http://example.org 

Kann mit jedem Anfragetyp verwendet werden.

-k (--insecure) überschreibt -s (stumm). Ravichandra vor 6 Jahren 0
10
Filip Spiridonov

Dadurch wird eine Anfrage an url gesendet, nur die erste Zeile der Antwort abgerufen, in Blöcke aufgeteilt und die zweite ausgewählt.

Es enthält den Antwortcode

curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2 
Können Sie erklären, was dieser Code bewirkt und wie er das vom OP vorgegebene Problem anspricht? Unerklärter Code kann für Benutzer als nicht vertrauenswürdig und gefährlich erscheinen. bwDraco vor 9 Jahren 1
Sicher, wir senden eine Anfrage an url, bekommen nur die erste Zeile der Antwort, teilen sie in Blöcke auf und wählen die zweite aus. Es enthält den Antwortcode, nach dem OP sucht. Filip Spiridonov vor 9 Jahren 0
10
mahatmanich

NUR Statuscode

[0]$ curl -LI http://www.example.org -o /dev/null -w '%\n' -s [0]$ 200 

Alles Gute zu diesem GIST

8
zafar142003

Für eine POST-Anfrage funktionierte Folgendes:

curl -w 'RESP_CODE:%' -s -X POST --data '{"asda":"asd"}' http://example.com --header "Content-Type:application/json"|grep -o 'RESP_CODE:[1-4][0-9][0-9]' 
7
Lucas Cimon

Dies ist eine schmerzhafte curl --failEinschränkung. Von man curl:

-f, --fail (HTTP) Fehler bei Serverfehlern im Hintergrund (keine Ausgabe)

Es gibt jedoch keine Möglichkeit, den Rückgabecode ungleich Null UND den Antworttext in stdout abzurufen.

Basierend auf der Antwort von pvandenberk und diesem anderen sehr nützlichen Trick, der bei SO gelernt wurde, gibt es hier einen Workaround:

curl_with_error_code () { _curl_with_error_code "$@" | sed '$d' } _curl_with_error_code () { local curl_error_code http_code exec 17>&1 http_code=$(curl --write-out '\n%\n' "$@" | tee /dev/fd/17 | tail -n 1) curl_error_code=$? exec 17>&- if [ $curl_error_code -ne 0 ]; then return $curl_error_code fi if [ $http_code -ge 400 ] && [ $http_code -lt 600 ]; then echo "HTTP $http_code" >&2 return 127 fi } 

Diese Funktion verhält sich genau wie curl, gibt jedoch 127 zurück (einen von nicht verwendeten Rückkehrcode curl), wenn ein HTTP-Code im Bereich [400, 600 [.

Vereinbart, die Fehlerausgabe nicht sehen zu können, ist eine schmerzhafte Einschränkung des ansonsten sehr praktischen - Ausfalls. Wie können Sie einen REST-API-Fehler diagnostizieren, ohne die Fehlerausgabe zu sehen? Es ist so schade, dass der Curl-Betreuer bagder hartnäckig darauf besteht, keinen --fail-but-show-error zu liefern. https://github.com/curl/curl/issues/1978 jamshid vor 6 Jahren 0