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
しかし、名前付きパイプは削除されていません。
ファイルを作成しないで解決する方法はあります。たとえば、魔女変数やストリームだけですか。
レスポンスの内容は一行です。 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"
}
最後の行にリターンボディと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つの別々の変数/ストリームを使用してこれを行うことをお勧めします。