APIにカールリクエストを行い、jqを使用してjsonを再インポートします。
結果
{
"errors": [],
"metadata": {
"clientTransactionId": "",
"serverTransactionId": "20190318164551347"
},
"responses": [
{
"comment": "",
"keyData": {
"algorithm": 13,
"flags": 257,
"protocol": 3,
"publicKey": "a1"
},
"keyTag": 28430
},
{
"comment": "",
"keyData": {
"algorithm": 13,
"flags": 257,
"protocol": 3,
"publicKey": "a4"
},
"keyTag": 28430
},
{
"comment": "",
"keyData": {
"algorithm": 13,
"flags": 257,
"protocol": 3,
"publicKey": "fa4"
},
"keyTag": 33212
}
],
"status": "success",
"warnings": []
}
これで、keyDataの4つの値を使用して2番目のAPIリクエストを作成するループが必要です。
しかし、どうすればいいですか?長い間検索しましたが見つかりませんでした。
私の要求:
curl -v -X POST --data '{
"authToken": ".......",
"clientTransactionId": "",
}' https:/domain.tld/api/v1/json/keysList | jq .
jq '.responses []'を使用すると、「配列」がありますが、私の値を含むループの解決策を見つけることはできません。
答え1
jq
「keyData」オブジェクトを検索した後、次のパイプに使用できますwhile read
。
jq -c '.responses[].keyData' file.json
{"algorithm":13,"flags":257,"protocol":3,"publicKey":"a1"}
{"algorithm":13,"flags":257,"protocol":3,"publicKey":"a4"}
{"algorithm":13,"flags":257,"protocol":3,"publicKey":"fa4"}
そこから:
jq -c '.responses[].keyData' file.json |
while read keydata; do curl --data "'$keydata'" http://example.com/service ; done
元curl
のコマンドを入力すると、パイプライン全体は次のようになります。
curl -v -X POST --data '{ "authToken": ".......", "clientTransactionId": "",}' https:/domain.tld/api/v1/json/keysList |
jq -c '.responses[].keyData' file.json |
while read keydata; do curl --data "'$keydata'" http://example.com/service ; done
curl
実行する前に、実際のURL、オプションなどを使用して2番目のコマンドを変更する必要があります。必要に応じて、echo
コマンドの前に/ステートメントを追加して、要求がどのように表示されるかを確認できます。printf
curl
答え2
または、UNIXユーティリティを使用できます。jtc
トラバースキーデータ:
bash $ <file.json jtc -w'[responses][:][keyData]' -r
{ "algorithm": 13, "flags": 257, "protocol": 3, "publicKey": "a1" }
{ "algorithm": 13, "flags": 257, "protocol": 3, "publicKey": "a4" }
{ "algorithm": 13, "flags": 257, "protocol": 3, "publicKey": "fa4" }
bash $
カーリングに与える。
bash $ <file.json jtc -w'[responses][:][keyData]' -r | while read keydata; do curl --data "'$keydata'" http://example.com/service ; done