0

我正在尝试为 vmware 应用程序的 API 请求创建脚本。我需要从有效载荷的字典中传递一个变量。

这是能够从邮递员开发的代码,输出被视为“python请求”:-

import requests
url = "url@domain/api-path"
payload = "{\r\n  \"name\" : \"VC Adapter Instance\",\r\n  \"description\" : \"A vCenter Adapter Instance\",\r\n  \"collectorId\" : \"1\",\r\n  \"adapterKindKey\" : \"VMWARE\",\r\n  \"resourceIdentifiers\" : [ {\r\n    \"name\" : \"AUTODISCOVERY\",\r\n    \"value\" : \"true\"\r\n  }, {\r\n    \"name\" : \"PROCESSCHANGEEVENTS\",\r\n    \"value\" : \"true\"\r\n  }, {\r\n    \"name\" : \"VCURL\",\r\n    \"value\" : \"vcenter_name\" \r\n  } ],\r\n  \"credential\" : {\r\n    \"id\" : null,\r\n    \"name\" : \"Added Credential\",  \r\n    \"adapterKindKey\" : \"VMWARE\",\r\n    \"credentialKindKey\" : \"PRINCIPALCREDENTIAL\",\r\n    \"fields\" : [ {\r\n      \"name\" : \"USER\",\r\n      \"value\" : \"administrator@vsphere.local\" \r\n    }, {\r\n      \"name\" : \"PASSWORD\",\r\n      \"value\" : \"Hidden-Password \" \r\n    } ],\r\n    \"others\" : [ ],\r\n    \"otherAttributes\" : { }\r\n  },\r\n  \"monitoringInterval\" : 1,\r\n  \"others\" : [ ],\r\n  \"otherAttributes\" : { }\r\n}\r\n"
headers = {
  'Accept': 'application/json',
  'Authorization': 'Hidden Token',
  'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data = payload)
print(response.text.encode('utf8'))

在此处输入图像描述

但是,我需要将突出显示的 vcenter_name 作为字典值传递,如下所示:-

import requests
url = "url@domain/api-path"
Inputs = {‘vcenterkey’ : ‘vcenter_name’}

payload = "{\r\n  \"name\" : \"VC Adapter Instance\",\r\n  \"description\" : \"A vCenter Adapter Instance\",\r\n  \"collectorId\" : \"1\",\r\n  \"adapterKindKey\" : \"VMWARE\",\r\n  \"resourceIdentifiers\" : [ {\r\n    \"name\" : \"AUTODISCOVERY\",\r\n    \"value\" : \"true\"\r\n  }, {\r\n    \"name\" : \"PROCESSCHANGEEVENTS\",\r\n    \"value\" : \"true\"\r\n  }, {\r\n    \"name\" : \"VCURL\",\r\n    \"value\" : \"inputs[‘vcenterkey’] \" \r\n  } ],\r\n  \"credential\" : {\r\n    \"id\" : null,\r\n    \"name\" : \"Added Credential\",  \r\n    \"adapterKindKey\" : \"VMWARE\",\r\n    \"credentialKindKey\" : \"PRINCIPALCREDENTIAL\",\r\n    \"fields\" : [ {\r\n      \"name\" : \"USER\",\r\n      \"value\" : \"administrator@vsphere.local\" \r\n    }, {\r\n      \"name\" : \"PASSWORD\",\r\n      \"value\" : \"Hidden-Password \" \r\n    } ],\r\n    \"others\" : [ ],\r\n    \"otherAttributes\" : { }\r\n  },\r\n  \"monitoringInterval\" : 1,\r\n  \"others\" : [ ],\r\n  \"otherAttributes\" : { }\r\n}\r\n"
headers = {
  'Accept': 'application/json',
  'Authorization': 'Hidden Token',
  'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data = payload)
print(response.text.encode('utf8')

)

在此处输入图像描述

附上截图供参考。

在有效负载中添加输入['vcenterkey'] 后,而不是 vcenter_name 中的值,我得到了有效负载中显示的确切 `inputs['vcenterkey'] ,这导致 API 在脚本中失败。

4

2 回答 2

3

最好使用 json 库来制定有效负载和 json.dumps() 来创建字符串

import requests
import json

url = "url@domain/api-path"
inputs = {'vcenterkey': 'vcenter_name'}

payload = {
    "name": "VC Adapter Instance",
    "description" : "A vCenter Adapter Instance",
    "collectorId" : "1",
    "adapterKindKey" : "VMWARE",
    "resourceIdentifiers": [
      {"name": "AUTODISCOVERY",
      "value": "true"}, 
      {"name": "PROCESSCHANGEEVENTS",
       "value": "true"},
      {"name": "VCURL",
       "value": inputs['vcenterkey']
      }],
    "credential": {
      "id" : None,
      "name" : "Added Credential",
      "adapterKindKey": "VMWARE",
      "credentialKindKey": "PRINCIPALCREDENTIAL",
      "fields": [{
        "name": "USER",
        "value": "administrator@vsphere.local"
      },
      {"name": "PASSWORD",
      "value" : "Hidden-Password"}],
      "others" : [ ],
      "otherAttributes": { }},
      "monitoringInterval": 1,
      "others" : [ ],
      "otherAttributes": { }}

headers = {
  'Accept': 'application/json',
  'Authorization': 'Hidden Token',
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, 
headers=headers, data = json.dumps(payload))
print(response.text.encode('utf8')
于 2020-05-18T22:05:19.920 回答
0

这不是处理 json 数据的正确方法。改用json库。或者您可以尝试改用格式化字符串。

例子:

import json

inputs = {'vcenterkey' : 'vcenter_name'}

payload = {"name": "VC Adapter Instance",
            "description" : "A vCenter Adapter Instance",
            "collectorId" : "1",
            "adapterKindKey" : "VMWARE",
            "resourceIdentifiers" :
                [{"name" : "AUTODISCOVERY","value" : "true"},
                {"name" : "PROCESSCHANGEEVENTS","value" : "true"},
                {"name" : "VCURL","value" : inputs['vcenterkey']}],
            "credential": {"id" : "null",
                           "name" : "Added Credential",
                           "adapterKindKey" : "VMWARE",
                           "credentialKindKey" :"PRINCIPALCREDENTIAL",
                           "fields":[{"name" : "USER","value" : "administrator@vsphere.local" },
                                     {"name" : "PASSWORD","value" : "Hidden-Password " } ],"others" : [ ],
                                    "otherAttributes" : { }},
                                    "monitoringInterval" : 1,
                                    "others" : [ ],
                                    "otherAttributes" : { }}

payload = json.dumps(payload)
print(payload)
于 2020-05-18T21:56:03.447 回答