SHELL 또는 Python을 사용하여 JSON을 변수 API로 호출

SHELL 또는 Python을 사용하여 JSON을 변수 API로 호출

다음과 같은 URL에 대한 API 액세스 권한이 있습니다.

curl https://api_url.com/device_groups/ -u api_key:

JSON 출력:

{
   "data":[
      {
         "type":"device_group",
         "id":85015,
         "attributes":{
            "name":"Initial"
         },
         "relationships":{
            "devices":{
               "data":[
                  
               ]
            }
         }
      },
      {
         "type":"device_group",
         "id":85683,
         "attributes":{
            "name":"mode-4"
         },
         "relationships":{
            "devices":{
               "data":[
                  
               ]
            }
         }
      },
      {
         "type":"device_group",
         "id":85684,
         "attributes":{
            "name":"Employees-3"
         },
         "relationships":{
            "devices":{
               "data":[
                  {
                     "type":"device",
                     "id":506044
                  },
                  {
                     "type":"device",
                     "id":658670
                  },
                  {
                     "type":"device",
                     "id":506034
                  },
                  {
                     "type":"device",
                     "id":506037
                  },
                  {
                     "type":"device",
                     "id":506038
                  },
                  {
                     "type":"device",
                     "id":506046
                  },
                  {
                     "type":"device",
                     "id":506043
                  },
                  {
                     "type":"device",
                     "id":658669
                  },
                  {
                     "type":"device",
                     "id":506036
                  },
                  {
                     "type":"device",
                     "id":502256
                  }
               ]
            }
         }
      },
      {
         "type":"device_group",
         "id":91589,
         "attributes":{
            "name":"Subcontractors-2"
         },
         "relationships":{
            "devices":{
               "data":[
                  {
                     "type":"device",
                     "id":658668
                  },
                  {
                     "type":"device",
                     "id":658671
                  },
                  {
                     "type":"device",
                     "id":506051
                  },
                  {
                     "type":"device",
                     "id":506048
                  },
                  {
                     "type":"device",
                     "id":506040
                  },
                  {
                     "type":"device",
                     "id":506050
                  },
                  {
                     "type":"device",
                     "id":506042
                  },
                  {
                     "type":"device",
                     "id":502236
                  },
                  {
                     "type":"device",
                     "id":506041
                  },
                  {
                     "type":"device",
                     "id":523577
                  },
                  {
                     "type":"device",
                     "id":506053
                  },
                  {
                     "type":"device",
                     "id":655780
                  },
                  {
                     "type":"device",
                     "id":508070
                  },
                  {
                     "type":"device",
                     "id":506052
                  },
                  {
                     "type":"device",
                     "id":506047
                  },
                  {
                     "type":"device",
                     "id":506035
                  },
                  {
                     "type":"device",
                     "id":506045
                  },
                  {
                     "type":"device",
                     "id":506039
                  },
                  {
                     "type":"device",
                     "id":506049
                  },
                  {
                     "type":"device",
                     "id":589426
                  }
               ]
            }
         }
      },
      {
         "type":"device_group",
         "id":92316,
         "attributes":{
            "name":"Employees-2"
         },
         "relationships":{
            "devices":{
               "data":[
                  {
                     "type":"device",
                     "id":673452
                  },
                  {
                     "type":"device",
                     "id":576554
                  },
                  {
                     "type":"device",
                     "id":672077
                  },
                  {
                     "type":"device",
                     "id":589167
                  }
               ]
            }
         }
      },
      {
         "type":"device_group",
         "id":92325,
         "attributes":{
            "name":"Employees"
         },
         "relationships":{
            "devices":{
               "data":[
                  
               ]
            }
         }
      },
      {
         "type":"device_group",
         "id":94908,
         "attributes":{
            "name":"mode 2"
         },
         "relationships":{
            "devices":{
               "data":[
                  {
                     "type":"device",
                     "id":501727
                  }
               ]
            }
         }
      },
      {
         "type":"device_group",
         "id":95017,
         "attributes":{
            "name":"Mode 1"
         },
         "relationships":{
            "devices":{
               "data":[
                  
               ]
            }
         }
      },
      {
         "type":"device_group",
         "id":95381,
         "attributes":{
            "name":"Employees-test"
         },
         "relationships":{
            "devices":{
               "data":[
                  {
                     "type":"device",
                     "id":658672
                  }
               ]
            }
         }
      },
      {
         "type":"device_group",
         "id":95382,
         "attributes":{
            "name":"Subcontracters-test"
         },
         "relationships":{
            "devices":{
               "data":[
                  
               ]
            }
         }
      }
   ],
   "has_more":false
}

각 장치를 사전 정의된 장치 그룹 ID로 이동한 다음 초기 JSON 컬에서 얻은 원래 그룹으로 장치를 반환해야 합니다.

예를 들어.

curl https://api_url.com/group/$predefined_group_id/devices/506044 -u api_key: -X POST

curl https://api_url.com/group/$original_group_id/devices/506044 -u api_key: -X POST

ID나 설명을 기준으로 특정 device_group을 변수로 제외할 수도 있나요?

답변1

jq명령

jq -r '
    .data.id as $groupid |
    .data.relationships.devices.data[].id |
    @sh "https://api_url.com/group/\($groupid)/devices/\(.)"' file

...그룹 ID를 추출한 다음 배열 id의 모든 값을 추출합니다 data. 각 id값에 대해 출력할 URL을 구성합니다.

호출 시 생성된 URL을 사용하려면 curl:

jq -r '
    .data.id as $groupid |
    .data.relationships.devices.data[].id |
    @sh "https://api_url.com/group/\($groupid)/devices/\(.)"' file |
xargs -I {} curl -X POST -u api_key: {}

질문의 JSON 문서가 주어지면 다음 명령이 실행됩니다.

curl -X POST -u api_key: https://api_url.com/group/85684/devices/506044
curl -X POST -u api_key: https://api_url.com/group/85684/devices/506034
curl -X POST -u api_key: https://api_url.com/group/85684/devices/506037
curl -X POST -u api_key: https://api_url.com/group/85684/devices/506038
curl -X POST -u api_key: https://api_url.com/group/85684/devices/506046
curl -X POST -u api_key: https://api_url.com/group/85684/devices/506043
curl -X POST -u api_key: https://api_url.com/group/85684/devices/658669
curl -X POST -u api_key: https://api_url.com/group/85684/devices/506036
curl -X POST -u api_key: https://api_url.com/group/85684/devices/502256

xargs또한 다음 URL을 사용하여 가능한 한 적은 호출을 수행할 수도 있습니다 .curl

jq -r '
    .data.id as $groupid |
    .data.relationships.devices.data[].id |
    @sh "https://api_url.com/group/\($groupid)/devices/\(.)"' file |
xargs curl -X POST -u api_key:

그러면 단일 명령이 생성됩니다.

curl -X POST -u api_key: https://api_url.com/group/85684/devices/506044 https://api_url.com/group/85684/devices/506034 https://api_url.com/group/85684/devices/506037 https://api_url.com/group/85684/devices/506038 https://api_url.com/group/85684/devices/506046 https://api_url.com/group/85684/devices/506043 https://api_url.com/group/85684/devices/658669 https://api_url.com/group/85684/devices/506036 https://api_url.com/group/85684/devices/502256

some_groupid다음과 같이 데이터에서 찾은 그룹 ID(변수 사용)를 사용하는 대신 명령줄에서 그룹 ID를 제공할 수 있습니다 .

jq -r --arg groupid "$some_groupid" '
    .data.relationships.devices.data[].id |
    @sh "https://api_url.com/group/\($groupid)/devices/\(.)"' file

답변2

그것은 정확히 내가 원했던 것입니다. @They가 더 우아하게 보이게 만들 수 있을 것이라고 확신하지만 그것은 내가 필요한 것을 수행합니다.

#!/bin/bash

# Set groupid also read and write API variables
group="80000"
read_api="read_api"
write_api="write_api"

# get all devicesid and groupid and create groups.json file
curl https://api_url.com/device_groups -u "$read_api": > groups.json

# Move all devices into predefined groupid
jq -r --arg groupid $group '
    .data[].relationships.devices.data[].id |
    @sh "https://api_url.com/device_groups/\($groupid)/devices/\(.)"' groups.json |
xargs curl -X POST -u "$write_api":

# Wait for the groupid to propagate
sleep 60;

# Move all devices into original groupid
jq -r '
    .data[] |
    "https://api_url.com/device_groups/\(.id)/devices/\(.relationships.devices.data[].id)"' groups.json |
xargs curl -X POST -u "$write_api":

관련 정보