Получить тело ответа и показать HTTP-код по curl

7893
mkczyk

У меня есть конечная точка, которая возвращает 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 "%\n" -o /dev/null https://swapi.co/api/people/1/?format=json 

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


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

touch tmpFile curl -s -w "%\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 "%\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 

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

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

3

2 ответа на вопрос

2
janos

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

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

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

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

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