I am trying to create a script for an API request for a vmware application. I need to pass a variable from a dictionary in payload.
Here is the code which was able to develop from postman and output is taken as "python requests":-
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'))
However I need I want to pass the highlighted vcenter_name as a dictionary value something like this:-
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')
)
Attaching screen shots for reference.
After adding inputs[‘vcenterkey’] in the payload , instead of the value in vcenter_name I am getting the exact `inputs[‘vcenterkey’] displayed in the payload which causes the API to fail in the script.
It is best to use json library to formulate the payload and json.dumps() to create the string
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')