it-swarm.com.de

Den Antworttext abrufen und den HTTP-Code durch Drehen anzeigen

Ich habe Endpunkt, der JSON (Antwortkörper) zurückgibt. Ich muss den Antwortkörper locken und verarbeiten (zum Beispiel mit jq). Es klappt:

response=$(curl -s https://swapi.co/api/people/1/?format=json)
name=$(echo $response tmpFile | jq '.name') # irrelevant command, but I need here response body
echo "name:"$name

Ich muss aber auch den HTTP-Code anzeigen (um zu zeigen, ob die Anfrage erfolgreich ist):

curl -s -w "%{http_code}\n" -o /dev/null https://swapi.co/api/people/1/?format=json

Wie bekomme ich den Antworttext auf Variable und zeige gleichzeitig den HTTP-Code (eine Anfrage)?


Ich finde die Lösung mit der temporären Datei heraus:

touch tmpFile
curl -s -w "%{http_code}\n" -o tmpFile https://swapi.co/api/people/1/?format=json
name=$(cat tmpFile | jq '.name') # irrelevant command, but I need here only body response
echo "name: "$name
rm tmpFile

Wie mache ich das, ohne eine Datei zu erstellen?

Ich versuche es mit Named Pipe (aber es muss noch eine Datei auf der Festplatte erstellt werden ...):

mkfifo tmpFifo
curl -s -w "%{http_code}\n" -o tmpFifo https://swapi.co/api/people/1/?format=json
name=$(cat tmpFifo | jq '.name') # irrelevant command, but I need here only body response
echo "name: "$name
rm tmpFifo

Die Named Pipe wird jedoch nicht entfernt.

Gibt es eine Lösung ohne eine Datei anzulegen, zum Beispiel nur mit welchen Variablen oder Streams?

6
mkczyk

Es sieht so aus, als ob der Inhalt der Antwort eine einzelne Zeile ist. Sie können zwei read-Aufrufe verwenden, um zwei Zeilen zu lesen:

curl -s -w "\n%{http_code}" 'https://swapi.co/api/people/1/?format=json' | {
    read body
    read code
    echo $code
    jq .name <<< "$body"
}
5
janos

Lösung mit Rückgabe und HTTP-Code in der letzten Zeile:

response=$(curl -s -w "\n%{http_code}" https://swapi.co/api/people/1/?format=json)
response=(${response[@]}) # convert to array
code=${response[-1]} # get last element (last line)
body=${response[@]::${#response[@]}-1} # get all elements except last
name=$(echo $body | jq '.name')
echo $code
echo "name: "$name

Trotzdem würde ich dies lieber mit zwei separaten Variablen/Streams tun, anstatt den Antworttext und den HTTP-Code in einer Variablen zu verketten.

2
mkczyk