it-swarm.com.de

Erhalten Sie die Locke, um den HTTP-Statuscode auszugeben?

Ich verwende curl in der Befehlszeile unter Linux, um HTTP-Anforderungen auszugeben. Die Antwortkörper werden auf Standardausdruck gedruckt, was in Ordnung ist, aber auf der Manpage kann ich nicht nachvollziehen, wie der HTTP-Statuscode aus der Antwort (404, 403 usw.) gedruckt wird. Ist das möglich?

713
kdt

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

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

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

455
pberlijn

Eine spezifischere Möglichkeit, nur den HTTP-Statuscode auszudrucken, ist wie folgt:

curl -s -o /dev/null -w "%{http_code}" 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 Leistung beim Laden der Antwort zu verbessern. Dieser Parameter fordert nur Status/Header der Antwort an, ohne den Antworttext herunterzuladen. (% {http_code} gibt in der ersten Zeile der HTTP-Nutzdaten zurück)

d. h .:

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

Wenn Sie sowohl die Überschrift 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
202
Enrico Susatyo

Sie können den Statuscode zusätzlich zu allen Kopfzeilen wie folgt drucken:

curl -i http://example.org

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

176
Cyril David

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 Ersetzung verarbeiten> () und Ersetzung befehlen $ () .

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

Verwenden Sie dann die Option -o von curl, um den Antwortinhalt mithilfe der Befehlssubstitution an ein temporäres FIFO umzuleiten, und leiten Sie die Ausgabe innerhalb dieser Befehlssubstitution mit -o >(cat >&3) an den aktuellen Prozess-STDOUT-Dateideskriptor 3 zurück.

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 "%{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, da SamK in den Kommentaren unten vermerkt ist.

60
Heath Borders

Curl-Ausgabe neu definieren:

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

Kann mit jedem Anfragetyp verwendet werden.

31

StatuscodeNUR

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

Alle Gutschriften auf diese Gist

14
mahatmanich

Dadurch wird eine Anfrage an die 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
11

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

-f, --fail (HTTP) Schlägt bei Serverfehlern im Hintergrund fehl (überhaupt keine Ausgabe)

Es gibt jedoch keine Möglichkeit, den Rückkehrcode ungleich NullUNDfür den Antworttext in stdout abzurufen.

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

curl_with_error_code () {
    _curl_with_error_code "[email protected]" | sed '$d'
}
_curl_with_error_code () {
    local curl_error_code http_code
    exec 17>&1
    http_code=$(curl --write-out '\n%{http_code}\n' "[email protected]" | 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 bei einem HTTP-Code im Bereich [400, 600 [127 zurück (ein von curl nicht verwendeter Rückkehrcode).

10
Lucas Cimon

Für eine POST -Anforderung 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]'
9
zafar142003
curl -so -i /dev/null -w "%{http_code}"  http://www.any_example.com

Dadurch werden die folgenden Informationen zurückgegeben:

  1. antwortdaten, wenn Daten wie ein Fehler von der API zurückgegeben werden
  2. statuscode
5
srana

Verwenden Sie den folgenden cURL-Befehl und leiten Sie ihn an grep weiter:

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

Hier ist, was jede Flagge tut:

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

Hier ist ein Link zu HTTP-Statuscodes .

Führen Sie von der Befehlszeile aus. Diese Locke wird im unbeaufsichtigten Modus ausgeführt, folgt allen Weiterleitungen und ruft die HTTP-Header ab. grep gibt den HTTP-Statuscode in der Standardausgabe aus.

5
Savitoj Singh

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 beschriebene Ansatz HEAD verwendet, was zwar schneller ist, aber bei einigen Web-weniger kompatiblen HTTP-Servern möglicherweise nicht funktioniert.

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

Ein Beispiel für die Verwendung der Antwortcodes. Ich verwende dies, um Geolite-Datenbanken nur dann erneut herunterzuladen, wenn sie sich geändert haben (-z) und auch folgende Weiterleitungen (-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
Stuart Cardall

Das OP möchte den Statuscode wissen. Wenn Sie eine Datei herunterladen, möchten Sie häufig auch ein Gefühl für deren Größe bekommen. Daher verwende ich curl zuerst, um den Statuscode und die Größe der Datei anzuzeigen, und schalte dann die ausführliche und direkte Datei an den gewünschten Ort und Namen aus:

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 der Locke

wait ${!}

bevor ich den nächsten Befehl ausführen. Das obige gibt eine nette Antwort wie:

http: 200 42824

http: 200 34728

http: 200 35452

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

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

3
sakumatto