API不接受来自Python的{J}数据

时间:2018-05-29 20:07:39

标签: python json python-requests

我是Python新手并处理JSON。我正在尝试从我的数据库中获取一个字符串数组并将它们提供给API。我不知道为什么我得到丢失的数据错误。你们可以看看吗?

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

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()

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

编辑清晰度:

我正在传递 [{“ContactId”:9},{“ContactId”:274556}] 我收到此回复正文 b'{“状态”:“错误”,“消息”:“ContactId是必需的。”}'

API文档将此作为请求正文的后续内容。 的 [   {     “ContactId”:“string”   } ]

当我手动将这些数据放入测试时,我得到了我想要的东西。 [   {     “ContactId”:“9”   },   {     “ContactId”:“274556”   } ]

json.dumps vs json.load可能有问题吗?我不是在创建一个字典,而是一个看起来像字典的字符串?

编辑我想出来了!:

这是愚蠢的。

我需要在 results_to_load = json.dumps(json_data)加载之前将 results_to_load = [] 定义为dict。

感谢所有答案并尝试提供帮助。

2 个答案:

答案 0 :(得分:0)

我建议你去检查API文档是否具体,但从中看来,API需要一个名为ContactID的字段,它是一个数组,而不是每个对象的对象数组密钥为contactId

或者

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

而不是

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

调整这可能会有所帮助:

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

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

答案 1 :(得分:0)

我想出来了!:

这很愚蠢。

我需要将 results_to_load = [] 定义为空dict,然后才将其加载到 results_to_load = json.dumps(json_data)

感谢所有答案并尝试提供帮助。