Frage Wie kann ich den HTTP-Statuscode ausgeben?


Ich benutze curl an der Befehlszeile unter Linux, um HTTP-Anfragen zu stellen. Die Antworthauptstellen werden nach Standardausgabe gedruckt, was in Ordnung ist, aber ich kann von der Manpage aus nicht sehen, wie man sich einrollen kann, um den HTTP-Statuscode aus der Antwort (404, 403 usw.) zu drucken. Ist das möglich?


559
2018-04-18 10:28


Ursprung


Was mich betrifft, kann ich aus dem Handbuch sehen, wie man den HTTP-Statuscode bekommt, aber die Option -w funktioniert nicht. Ich habe den Fehler an Apple gemeldet. - Nicolas Barbulesco
Das -i Flagge, wie in curl -i https://www.example.com/, ist wahrscheinlich, was du willst, wie per superuser.com/a/514798/190188 - caw


Antworten:


Dies sollte für Sie arbeiten ob Der Webserver kann auf HEAD-Anfragen antworten (dies führt nicht dazu, dass a GET):

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

Um cURL Redirects (3xx-Status) folgen zu lassen, fügen Sie -L hinzu.


350
2018-04-18 10:56



NB: curl -I Führt eine HEAD HTTP-Anfrage durch, was problematisch für das Testen des HTTP-Statuscodes für einige Webanwendungsserver und -dienste sein kann - Jay Taylor
Und um nur die Statusnummer zu erhalten, leiten Sie sie an head -n 1|cut -d$' ' -f2 - Benubird
Vergessen Sie nicht, curls stderr umzuleiten: curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2. Fügen Sie -L zum Einrollen hinzu, wenn Sie nach Umleitungen den endgültigen Status benötigen. - Aaron Blenkush
Die Weiterleitung nach dem Ausführen einer HEAD-Anfrage kann je nach Programmierung der App zu einem interessanten Verhalten führen. - Scott McIntyre
curl -I -X GET wird eine GET-Anfrage senden, aber die gleiche Ausgabe geben. - jiggy


Eine spezifischere Möglichkeit zum Ausdrucken gerade Der HTTP-Statuscode ist in etwa wie folgt:

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

Es ist viel einfacher in Skripten zu arbeiten, da es kein Parsing benötigt :-)

Der Parameter -I könnte hinzugefügt werden, um die Antwortlastleistung zu verbessern. Dieser Parameter fragt nur nach Status / Header der Antwort, ohne Download Antworttext. (% {http_code} gibt in der ersten Zeile der HTTP-Payload zurück)

das heißt:

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

625
2018-06-28 00:25



-w "% {http_code}" ist das Bit, das den Statuscode ausgibt. Sie können einen oder zwei neue Zeilen hinzufügen, um den Code vom Hauptteil zu trennen (-w "\ n \ n% {http_code} \ n") - Jeffrey Martinez
Wow, das /dev/null Das funktioniert sogar in der Windows-Version von Curl, die ich benutze. - Uwe Keim
Ich glaube, das lädt die gesamte Datei herunter, obwohl alles nach / dev / null geht, also nicht ideal, um den Statuscode für große Dateien zu überprüfen. httping -c 1 -s -G -m gibt ein GET aus und lädt nicht die ganze Datei herunter, obwohl mir klar ist, dass diese Frage sich speziell auf Curl bezieht. - RomanSt
@romkyns, du hast recht: Die erste Variante in meiner Antwort lädt die gesamte Datei herunter und "speichert" sie /dev/null, aber die zweite Variante - dh. derjenige, der das benutzt -I Option für curl - nicht. Es muss jedoch Vorsicht walten gelassen werden, da Sie nicht die gleiche Aktion testen: Man tut ein HTTP GET Anfrage, während der andere macht a HEAD Anfrage ... einige Webserver / Webseiten antworten mit einem anderen Statuscode, auch wenn die angeforderte URL genau gleich ist! - pvandenberk
Zu Ihrer Information: -s = Download-Fortschritt nicht anzeigen, -o /dev/null = zeige den Körper nicht an, -w "%{http_code}" = Schreiben Sie den HTTP Response Code nach dem Beenden auf stdout. - Ajedi32


Wenn Sie sowohl den Header als auch das Ergebnis sehen möchten, können Sie die Option verbose 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

171
2018-05-03 04:28



+1 für das Aufzeigen der ausführlichen Flagge liefert die zusätzlichen Details. Ideal zum Testen von REST-Apps. - MrOodles
+1 sehr einfach zu verwenden, wenn Sie eine POST-Anfrage machen (curl -v --data "...") - MegaTux
Es teilt sie sogar in zwei verschiedene Dateiausgaben auf (http-Statusdetails zu stderr und response body zu stdout) - Blauhirn


Sie können den Statuscode zusätzlich zu allen Kopfzeilen drucken, indem Sie folgendermaßen vorgehen:

curl -i http://example.org

Das Gute daran -i ist, dass es mit funktioniert -X POST auch.


142
2017-12-04 20:45



Viel besser als die angenommene Antwort (was eine HEAD Anfrage). - neu242
Vielleicht offensichtlich, aber -i funktioniert mit irgendein HTTP-Methode, nicht nur GET und POST... :) - mac
Die beste Antwort, da curl sowohl Header als auch Text ausgibt, wodurch es für die meisten Aufgaben geeignet ist, wenn es in einem Skript verwendet wird - Sarge Borsch
Dies ist die beste Antwort und kann in Verbindung mit verwendet werden -s (Fortschrittsanzeige oder Fehlermeldungen nicht anzeigen) und -S(Zeige schließlich Fehlermeldungen) - Jonathan Hartley


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

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

Dann benutze Curls -o Option zum Umleiten des Antwortinhalts in einen temporären Fifo mithilfe der Befehlsersetzung und dann innerhalb dieser Befehlsersetzung die Ausgabe zurück an den aktuellen Prozess STDOUT-Dateideskriptor 3 mit -o >(cat >&3).

Alles zusammenfügen:

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

45
2018-01-08 20:59



Das ist ernste Schmiersucht ... und ich mag es! - spyle
Wie kann ich die Ausgabe wiederum auf eine andere Variable umleiten? - Roger Filmyer
Die Ausgabe ist in STDOUTDaher sollten Sie in der Lage sein, die Ausgabe des Befehls an eine beliebige Stelle umzuleiten, genau wie bei einem normalen Befehl. Ich habe das allerdings nicht getestet. - Heath Borders


Definieren Sie die Curl-Ausgabe neu:

curl -sw '%{http_code}' http://example.org

Kann mit jedem Anfragetyp verwendet werden.


26
2017-08-05 18:18



-k (--insecure) überschreibt -s (still). - Ravichandra


Dies sendet eine Anfrage an die URL, holt nur die erste Zeile der Antwort, teilt sie auf Blöcke und wählt die zweite aus.

Es enthält den Antwortcode

curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2

10
2017-07-15 20:08



Können Sie erklären, was dieser Code tut und wie er das Problem des OP anspricht? Ungeklärter Code kann für Benutzer nicht vertrauenswürdig und gefährlich erscheinen. - bwDraco
Sicher, wir senden eine Anfrage an die URL, holen nur die erste Zeile der Antwort, teilen sie auf Blöcke und wählen die zweite aus. Es enthält den Antwortcode, nach dem OP sucht. - Filip Spiridonov


Für eine POST-Anfrage hat Folgendes funktioniert:

curl -w 'RESP_CODE:%{response_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]'

8
2018-01-07 08:36