首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >API调用JSON使用SHELL或Python变量

API调用JSON使用SHELL或Python变量
EN

Unix & Linux用户
提问于 2021-11-18 12:18:11
回答 2查看 959关注 0票数 0

我可以访问一个url,它看起来有点像这样:

代码语言:javascript
复制
curl https://api_url.com/device_groups/ -u api_key:

在JSON中输出:

代码语言:javascript
复制
{
   "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卷曲中提取的原始组。

例如:

代码语言:javascript
复制
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

您还可以将特定的device_groups排除为变量吗?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2021-11-20 12:20:20

这正是我想做的,我相信他们可以让它看起来更优雅,但它能满足我的需要。

代码语言:javascript
复制
#!/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":
票数 0
EN

Unix & Linux用户

发布于 2021-11-18 12:32:49

jq命令

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

..。将提取组ID,然后从data数组提取所有D3值。对于每个id值,它将构造一个要输出的URL。

要在调用curl时使用这些生成的URL:

代码语言:javascript
复制
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文档,这将执行以下命令:

代码语言:javascript
复制
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

代码语言:javascript
复制
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:

这将生成一个命令

代码语言:javascript
复制
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

您可以从命令行提供组ID,而不是使用这样的数据中的ID(使用变量some_groupid):

代码语言:javascript
复制
jq -r --arg groupid "$some_groupid" '
    .data.relationships.devices.data[].id |
    @sh "https://api_url.com/group/\($groupid)/devices/\(.)"' file
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/678092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档