2016-07-11 2 views
1

Ich habe ein Bash-Skript, um mehrere APIs mit HTTPie aufzurufen. Ich möchte sowohl den Antworttext als auch den HTTP-Statuscode erfassen.Wie erfassen Sie tatsächlichen Antwort-Code und Antworttextkörper mit HTTPie im Bash-Skript?

Hier ist das Beste, was ich bisher geschafft:

rspBody=$(http $URL --check-status --ignore-stdin) 
statusCode=$? 

Befehl Substitution lässt mich den Körper bekommen, und die „--check-Status“ Flag gibt mir einen vereinfachten Code (wie 0, 3 , 4 usw.), die der Code-Familie entsprechen.

Das Problem ist, ich brauche zu unterscheiden, sagen ein 401 und ein 404-Code, aber ich bekomme nur 4.

Gibt es eine Möglichkeit, den tatsächlichen Status-Code zu erhalten, ohne eine ausführliche Dump in eine Datei zu tun zu haben und nach Dingen suchen?

[Bearbeiten]

Das ist mein Problem zu umgehen, falls es jemand hilft, aber ich würde immer noch wie eine bessere Idee, wenn Sie eine haben:

TMP=$(mktemp) 
FLUSH_RSP=$(http POST ${CACHE_URL} --check-status --ignore-stdin 2> "$TMP") 
STAT_FAMILY=$? 

flush_err=$(cat "$TMP" | awk '{ 
    where = match($0, /[0-9]+/) 
    if (where) { 
    print substr($0, RSTART, RLENGTH); 
    } 
}' -) 
rm "$TMP" 

STDERR enthält eine (in der Regel) 3- Zeile Nachricht mit dem HTTP-Code darin, so dass ich es in eine temporäre Datei ablegen und bin immer noch in der Lage, den Antworttext (von STDOUT) in einer Variablen zu erfassen.

Dann parse ich diese temporäre Datei auf der Suche nach einer Nummer, aber das scheint mir fragil.

Antwort

2

Es gibt keine fertige Lösung als solche, aber es ist mit ein bisschen Scripting erreichbar. Zum Beispiel:

STATUS=$(http -hdo ./body httpbin.org/get 2>&1 | grep HTTP/ | cut -d ' ' -f 2) 
BODY=$(cat ./body) 
rm ./body 
echo $STATUS 
# 200 
echo $BODY 
# { "args": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "identity", "Host": "httpbin.org", "User-Agent": "HTTPie/1.0.0-dev" }, "origin": "84.242.118.58", "url": "http://httpbin.org/get" } 

Erklärung des Befehls:

http --headers \    # Print out the response headers (they would otherwise be supressed for piped ouput) 
    --download \    # Enable download mode 
    --output=./body \  # Save response body to this file 
    httpbin.org/get 2>&1 \ # Merge STDERR into STDOUT (with --download, console output otherwise goes to STDERR) 
    | grep HTTP/ \   # Find the Status-Line 
    | cut -d ' ' -f 2   # Get the status code 

https://gist.github.com/jkbrzt/ad06f159c5afbe278b5fcfa8bf3b5313

+0

Dies erfordert auch eine temporäre Datei, aber es ist etwas sauberer. Vielen Dank. [Bearbeiten] Anscheinend habe ich nicht genug rep, um dies die Antwort zu stimmen, sorry. –

+1

Ah, fand heraus, dass ich nur auf das Häkchen klicken musste. Vielen Dank! –

Verwandte Themen