2011-04-18 10:28:57 +0000 2011-04-18 10:28:57 +0000
864

Bringen Sie Curl dazu, HTTP-Statuscode auszugeben?

Ich verwende curl an der Befehlszeile unter Linux, um HTTP-Anfragen zu stellen. Die Antwortkörper werden standardmäßig ausgedruckt, was in Ordnung ist, aber ich kann in der Man Page nicht sehen, wie ich Curl dazu bringe, den HTTP-Statuscode aus der Antwort auszugeben (404, 403 usw.). Ist dies möglich?

Antworten [16]

906
2012-06-28 00:25:11 +0000

Eine spezifischere Art, nur den HTTP-Statuscode auszudrucken, ist etwas in der Art von:

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

Viel einfacher in Skripten zu arbeiten, da es kein Parsen erfordert :-)

Der Parameter -I könnte hinzugefügt werden, um die Antwortladeleistung zu verbessern. Dieser Parameter fordert nur den Status/Header der Antwort an, ohne den Download-Antwortkörper.

Anmerkung: %{http_code} kehrt in der ersten Zeile der HTTP-Nutzlast

zurück, d.h.:

curl -s -o /dev/null -I -w "%{http_code}" http://www.example.org/
906
572
2011-04-18 10:56:02 +0000

Dies sollte für Sie funktionieren wenn der Webserver in der Lage ist, auf HEAD-Anfragen zu antworten (dies wird keine GET ausführen):

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

Als Zusatz, um cURL Weiterleitungen (3xx Status) folgen zu lassen, fügen Sie -L hinzu.

572
237
2012-05-03 04:28:44 +0000

Wenn Sie sowohl die Kopfzeile als auch das Ergebnis sehen möchten, können Sie die ausführliche 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
237
218
2012-12-04 20:45:49 +0000

Sie können den Statuscode zusätzlich zu allen Kopfzeilen ausdrucken, indem Sie wie folgt vorgehen:

curl -i http://example.org

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

218
71
2015-01-08 20:59:43 +0000

Wenn Sie den HTTP-Statuscode in einer Variablen erfassen, den Inhalt aber trotzdem nach STDOUT umleiten möchten, müssen Sie zwei STDOUTs anlegen. Sie können dies mit Prozess-Substitution >() und Befehls-Substitution $() tun.

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

Verwenden Sie dann die Option -o von curl, um den Inhalt der Antwort mit Hilfe der Befehlsersetzung in ein temporäres Fifo umzuleiten, und leiten Sie dann innerhalb dieser Befehlsersetzung die Ausgabe wieder zu Ihrem aktuellen Prozess STDOUT-Dateideskriptor 3 mit -o >(cat >&3) um.

Zusammenfügen 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 "%{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')

Beachten Sie, dass dies in /bin/sh nicht funktioniert, wie SamK in den Kommentaren unten angemerkt .

71
35
2014-08-05 18:18:29 +0000

Curl-Ausgabe neu definieren:

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

Kann mit jedem Anforderungstyp verwendet werden.

35
19
2017-02-08 10:44:15 +0000

Statuscode NUR

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

Alle Gutschriften zu diesem GIST

19
14
2016-04-06 13:08:49 +0000

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

-f, --fail (HTTP) Fail silently (überhaupt keine Ausgabe) bei Serverfehlern

Aber es gibt keine Möglichkeit, sowohl den Nicht-Null-Returncode UND den Antwortkörper in stdout zu erhalten.

Basierend auf der Antwort von pvandenberk und diesem anderen sehr nützlichen Trick, der auf SO gelernt wurde, hier eine Abhilfe:

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%{http_code}\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 aber 127 (einen von curl nicht verwendeten Rückgabewert) im Falle eines HTTP-Codes im Bereich [400, 600[ zurück.

14
11
2015-07-15 20:08:53 +0000

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

Sie enthält den Antwortcode

curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
11
9
2016-01-07 08:36:07 +0000

Bei einer POST-Anfrage funktionierte Folgendes:

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]'
9
6
2016-11-21 11:28:27 +0000

Verwenden Sie den folgenden cURL-Befehl und übergeben Sie ihn über die Pipeline an grep wie folgt:

$ curl -I -s -L http://example.com/v3/get_list | grep "HTTP/1.1"

Jedes Flag bewirkt Folgendes:

  • -I: Nur Antwortheader
  • -s anzeigen: Stumm - Fortschrittsbalken nicht anzeigen
  • -L: Folgen Sie den Location:-Headern

Hier ist ein Link zu HTTP-Statuscodes .

Von der Befehlszeile ausführen. Dieser Curl läuft im stillen Modus, folgt allen Umleitungen, holt sich die HTTP-Header. grep wird den HTTP-Statuscode auf die Standardausgabe ausgeben.

6
5
2017-03-08 05:12:46 +0000
curl -so -i /dev/null -w "%{http_code}" http://www.any_example.com

Dies gibt die folgenden Informationen zurück:

  1. Antwortdaten, wenn Daten wie Fehler von API zurückgegeben werden 2.
5
4
2016-06-23 10:37:18 +0000

Hier ist ein Curl-Befehl, der GET verwendet und den HTTP-Code zurückgibt.

curl -so /dev/null -w '%{response_code}' http://www.example.org

Bitte denken Sie daran, dass der unten stehende Ansatz HEAD verwendet, was schneller ist, aber möglicherweise nicht gut mit einigen weniger Web-konformen HTTP-Servern funktioniert.

curl -I http://www.example.org
4
4
2018-04-01 17:21:59 +0000

Ein Beispiel für die Verwendung der Antwortcodes. Ich benutze diese, um Geolite-Datenbanken nur dann erneut herunterzuladen, wenn sie sich geändert haben (-z) & auch folgende Umleitungen (-L):

url=http://example.com/file.gz
file=$(basename $url)

response=$(curl -L -s -o $file -z $file $url -w "%{http_code}")

case "$response" in
        200) do_something ;;
        301) do_something ;;
        304) printf "Received: HTTP $response (file unchanged) ==> $url\n" ;;
        404) printf "Received: HTTP $response (file not found) ==> $url\n" ;;
          *) printf "Received: HTTP $response ==> $url\n" ;;
esac
4
3
2017-10-07 07:32:50 +0000

Der OP möchte den Statuscode wissen. Oft möchte man beim Herunterladen einer Datei auch ein Gefühl für deren Größe bekommen, deshalb benutze ich curl, um zuerst den Statuscode und die Größe der Datei anzuzeigen, und schalte dann verbose und direct file to the place and name I want:

curl -R -s -S -w "\nhttp: %{http_code} %{size_download}\n" -o /Users/myfiles/the_local_name.html http://archive.onweb.com/the_online_name.html

Dann warte ich auf das Ende von curl

wait ${!}

, bevor ich den nächsten Befehl ausführe. Wenn das Obige in einem Skript mit vielen Befehlen wie oben verwendet wird, ergibt sich eine nette Antwort wie:

http: 200 42824

http: 200 34728

http: 200 35452

Bitte beachten Sie, dass -o in curl vom vollständigen Pfad der Datei + Dateiname gefolgt werden muss. Auf diese Weise können Sie Dateien in einer sinnvollen Namensstruktur speichern, wenn Sie sie mit curl d/l d/l versehen. Beachten Sie auch, dass -s und -S zusammen verwendet die Ausgabe zum Schweigen bringen, aber Fehler anzeigen. Beachten Sie auch, daß -R versucht, den Zeitstempel der Datei auf den der Web-Datei zu setzen.

Meine Antwort basiert auf dem, was @pvandenberk ursprünglich vorgeschlagen hat, aber zusätzlich speichert es die Datei tatsächlich irgendwo ab, anstatt nur auf /dev/null zu verweisen.

3
1
2019-06-04 08:08:22 +0000

Teilen Sie den Ausgabeinhalt auf stdout und den HTTP-Statuscode auf stderr:

curl http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2

Wenn nur der HTTP-Statuscode stderr gewünscht wird, kann --silent verwendet werden:

curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2

Der gewünschte Stream kann dann ausgewählt werden, indem unerwünschte Streams nach /dev/null umgeleitet werden:

$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 1>/dev/null
200
$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 2>/dev/null

...

Hinweis: Damit sich die zweite Umleitung wie gewünscht verhält, müssen wir den Befehl curl in der Subshell ausführen.

1