ManOAction
ManOAction

Reputation: 403

API not accepting my JSON data from Python

I'm new to Python and dealing with JSON. I'm trying to grab an array of strings from my database and give them to an API. I don't know why I'm getting the missing data error. Can you guys take a look?

###########################################

rpt_cursor = rpt_conn.cursor()
sql="""SELECT `ContactID` AS 'ContactId' FROM 
`BWG_reports`.`bounce_log_dummy`;"""
rpt_cursor.execute(sql)

row_headers=[x[0] for x in rpt_cursor.description] #this will extract row headers
row_values= rpt_cursor.fetchall()
json_data=[]
for result in row_values:
    json_data.append(dict(zip(row_headers,result)))
results_to_load = json.dumps(json_data)
print(results_to_load) # Prints: [{"ContactId": 9}, {"ContactId": 274556}]


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

targetlist = '302'
# This is for their PUT to "add multiple contacts to lists".
api_request_url = 'https://api2.xyz.com/api/list/' + str(targetlist) 
+'/contactid/Api_Key/' + bwg_apikey

print(api_request_url) #Prints https://api2.xyz.com/api/list/302/contactid/Api_Key/#####
response = requests.put(api_request_url, headers=headers, data=results_to_load)

print(response) #Prints <Response [200]>
print(response.content) #Prints b'{"status":"error","Message":"ContactId is Required."}'

rpt_conn.commit()
rpt_cursor.close()

###########################################################

Edit for Clarity:

I'm passing it this [{"ContactId": 9}, {"ContactId": 274556}] and I'm getting this response body b'{"status":"error","Message":"ContactId is Required."}'

The API doc gives this as the from to follow for the request body. [ { "ContactId": "string" } ]

When I manually put this data in there test thing I get what I want. [ { "ContactId": "9" }, { "ContactId": "274556" } ]

Maybe there is something wrong with json.dumps vs json.load? Am I not creating a dict, but rather a string that looks like a dict?

EDIT I FIGURED IT OUT!:

This was dumb.

I needed to define results_to_load = [] as a dict before I loaded it at results_to_load = json.dumps(json_data).

Thanks for all the answers and attempts to help.

Upvotes: 0

Views: 267

Answers (2)

ManOAction
ManOAction

Reputation: 403

I FIGURED IT OUT!:

This was dumb.

I needed to define results_to_load = [] as an empty dict before I loaded it at results_to_load = json.dumps(json_data).

Thanks for all the answers and attempts to help.

Upvotes: 0

Yuvraj Jaiswal
Yuvraj Jaiswal

Reputation: 1723

I would recommend you to go and check the API docs to be specific, but from it seems, the API requires a field with the name ContactID which is an array, rather and an array of objects where every object has key as contactId

Or

//correct
{
    contactId: [9,229]
} 

instead of

// not correct
[{contactId:9}, {contactId:229}]

Tweaking this might help:

res = {}
contacts = []
for result in row_values:
    contacts.append(result)
res[contactId] = contacts
...
...

response = requests.put(api_request_url, headers=headers, data=res)

Upvotes: 0

Related Questions