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

у меня есть конечная точка, которая возвращает JSON (тело ответа). Мне нужно получить curl тело ответа и обработать его (например, используя 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

но именованный канал не удаляется.

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

23
задан mkczyk
22.11.2022 15:25 Количество просмотров материала 3490
Распечатать страницу

2 ответа

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

curl -s -w "\n%{http_code}" 'https://swapi.co/api/people/1/?format=json' | {
    read body
    read code
    echo $code
    jq .name <<< "$body"
}
2
отвечен janos 2022-11-23 23:13

решение с возвращаемым телом и 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 в одной переменной.

0
отвечен mkczyk 2022-11-24 01:30

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх