web-dev-qa-db-fra.com

Obtenir le corps de la réponse et afficher le code HTTP par curl

J'ai un point de terminaison qui renvoie JSON (corps de la réponse). J'ai besoin de boucler le corps de la réponse et de le traiter (par exemple en utilisant jq). Ça marche:

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

Mais j'ai aussi besoin de montrer le code HTTP (pour montrer si la demande est réussie):

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

Comment obtenir le corps de la réponse à la variable et afficher le code HTTP en même temps (une demande)?


Je trouve la solution dans le fichier temporaire:

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

Comment faire sans créer de fichier?

J'essaie avec un tube nommé (mais il faut toujours créer un fichier sur le disque ...):

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

Mais le tuyau nommé ne supprime pas.

Il y a une solution sans créer de fichier, par exemple seulement des variables ou des flux?

6
mkczyk

Il semble que le contenu de la réponse soit une seule ligne. Vous pouvez utiliser deux appels read pour lire deux lignes:

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

Solution avec corps de retour et code HTTP à la dernière ligne:

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

Mais je préférerais néanmoins le faire avec deux variables/flux distincts plutôt que de concaténer le corps de la réponse et le code HTTP en une seule variable.

2
mkczyk