4

У меня есть конечная точка, которая возвращает JSON (тело ответа). Мне нужно получить, свернув тело ответа и обработав его (например, с помощью jq). Оно работает:

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

Но мне также нужно показать код HTTP (чтобы показать, если запрос выполнен успешно):

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

Как получить тело ответа на переменную и показать HTTP-код одновременно (один запрос)?


Я нашел решение с временным файлом:

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

Как обойтись без создания файла?

Я пытаюсь с именованным каналом (но это все еще нужно для создания файла на диске ...):

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

Но именованная труба не удаляется.

Есть решение без создания какого-либо файла, например, только переменные ведьмы или потоки?

2 ответа2

4

Похоже, содержание ответа представляет собой одну строку. Можно использовать два вызова read читать две строки:

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

Решение с телом возврата и HTTP-кодом в последней строке:

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

Но все же я бы предпочел сделать это с двумя отдельными переменными / потоками вместо объединенного тела ответа и HTTP-кода в одной переменной.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .