
IDを抽出し、それを繰り返し、REST APIを実行するためにカールを使用してAPIに複数の要求を送信する必要があるJSON出力があります。たとえば、
JSON出力は次のとおりです。
{
"glossary": [
{
"Title": "example glossary1",
"id": 1,
"description": "Hello Glossary1"
},
{
"Title": "example glossary2",
"id": 2,
"description": "Hello Glossary2"
},
{
"Title": "example glossary3",
"id": 3,
"description": "Hello Glossary3"
},
{
"Title": "example glossary4",
"id": 4,
"description": "Hello Glossary4"
}
]
}
シェルスクリプトは、このJSONファイルを繰り返し、IDを抽出し、繰り返し、CURLを使用してREST API呼び出しを実行する必要があります。
例は次のとおりです。
for (( i = 0 ; i < ${#id[@]} ; i++ ))
do
POST REST API
done
答え1
tmp.json というファイルで出力する場合は、以下を使用してください。ジャック行ごとにIDのリストを取得し、単純なforループを使用してAPIに投稿を公開します。
for i in `cat tmp.json | jq .glossary[].id`; do
curl -X POST http://host/api/$i"
done
答え2
以下は、次の使用例ですawk
。
#!/bin/bash
for id in $(awk '/"id":/ {sub(/,/, ""); print $2}' inputfile.json); do
curl -X POST ...
done
答え3
awk最大3桁のIDがありません。 STDINを介してJSON結果をプッシュし、whileループを使用して読みます。
digits=0;
while read line
do
foo=`echo $line|grep id|cut -c 7-$((7+digits))`
if [[ ! $foo -eq '' ]]
then
echo "curl http://webaddress/api?id=$foo"
if [[ '$foo' == '9' ]] || [[ '$foo' == '99' ]]
then
digits=$((digits+1))
fi
fi
done<your-json-output.json
答え4
{...}
Curlを使用すると、URLに中括弧()を使用して、同じエンドポイントに対して一度に複数の要求を実行できます。
たとえば、エンドポイントが次のような場合
http://example.com/api/endpoint
その後、次のように特定のパラメータに対して3つの値を使用して呼び出すことができますid
。
curl 'http://example.com/api/endpoint?id={123,345,456}'
JSONドキュメントの中かっこ内にカンマで区切られた整数セットにIDを取得するには、jq
次のように使用します。
jq -r '.glossary | map(.id) | "{\(join(","))}"' file
質問に記載されている文書の場合は文字列を返します{1,2,3,4}
。
その後、単一の呼び出しで使用できますcurl
。
ids=$( jq -r '.glossary | map(.id) | "{\(join(","))}"' file )
curl -s "http://example.com/api/endpoint?id=$ids"