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?
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"
}
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.