while 루프에서 cURL을 사용하여 json 데이터 게시 - bash 쉘

while 루프에서 cURL을 사용하여 json 데이터 게시 - bash 쉘

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"

관련 정보