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?
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
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.)
-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:
+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 bash3.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')
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.
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
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