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
그런 다음 다음과 같이 특정 매개변수에 대해 세 가지 값을 사용하여 호출할 수 있습니다 id
.
curl 'http://example.com/api/endpoint?id={123,345,456}'
JSON 문서에서 중괄호 안에 쉼표로 구분된 정수 집합으로 ID를 가져오려면 jq
다음과 같이 사용하세요.
jq -r '.glossary | map(.id) | "{\(join(","))}"' file
질문에 제공된 문서의 경우 string 을 반환합니다 {1,2,3,4}
.
그런 다음 단일 호출에서 사용할 수 있습니다 curl
.
ids=$( jq -r '.glossary | map(.id) | "{\(join(","))}"' file )
curl -s "http://example.com/api/endpoint?id=$ids"