Nhận phần phản hồi và hiển thị mã HTTP bằng cách cuộn tròn


7

Tôi có điểm cuối trả về JSON (phần thân phản hồi). Tôi cần có được bằng cách cuộn cơ thể phản hồi và xử lý nó (ví dụ như sử dụng jq). Nó hoạt động:

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

Nhưng tôi cũng cần hiển thị Mã HTTP (để hiển thị nếu yêu cầu thành công):

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

Làm cách nào để phần thân phản hồi biến và hiển thị mã HTTP cùng một lúc (một yêu cầu)?


Tôi tìm ra giải pháp tạm thời phù thủy tập tin:

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

Làm thế nào để làm mà không tạo tập tin?

Tôi thử với tên ống (nhưng nó vẫn cần tạo tệp trên đĩa ...):

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

Nhưng ống tên là không loại bỏ.

Có giải pháp mà không tạo bất kỳ tập tin nào, ví dụ chỉ có biến phù thủy hoặc luồng?

Câu trả lời:


6

Có vẻ như nội dung của phản hồi là một dòng duy nhất. Bạn có thể sử dụng hai readcuộc gọi để đọc hai dòng:

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

2

Giải pháp với phần thân và mã HTTP ở dòng cuối cùng:

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

Nhưng tôi vẫn muốn làm điều này với hai biến / luồng riêng biệt thay vì thân phản hồi nối và mã HTTP trong một biến.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.