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개 값을 사용하여 두 번째 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, 옵션 등을 사용하여 두 번째 명령을 수정해야 합니다. 필요한 경우 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