web-dev-qa-db-ja.com

応答本体を取得し、curlでHTTPコードを表示する

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コードを表示するのですか(1リクエスト)。


私は解決策魔女の一時ファイルを見つけます:

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

しかし、名前付きパイプは削除されていません。

ファイルを作成しないで解決する方法はあります。たとえば、魔女変数やストリームだけですか。

6
mkczyk

レスポンスの内容は一行です。 2つのread呼び出しを使用して2行を読み取ることができます。

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

最後の行にリターンボディと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コードを1つの変数に連結するのではなく、2つの別々の変数/ストリームを使用してこれを行うことをお勧めします。

2
mkczyk