我正在尝试使用python脚本将一些数据推送到Zurmo CRM,但我遇到了数据格式的问题。对于http请求,我使用的是Python中的 requests 模块。
下面我将分享一段包含数据和HTTP请求的代码:
数据:
data = {
"firstName": "Python",
"lastName": "IAmNotBlank",
"officePhone": "01254870016",
"companyName": "Python Test",
"state": {
"id": str(1)
},
"owner": {
"id": str(6)
},
"source": {
"value": "Website Form"
},
"primaryEmail": "luis@eazycollect.co.uk",
"sunCstm": {
"value": "I have my own SUN"
},
"averageCstm": "100",
"oftenCstm": {
"value": "Weekly"
},
"ddcustCstm": "100",
"website": "www.google.com"
}
HTTP请求:
headers = {
"Accept": "application/json",
"ZURMO_API_REQUEST_TYPE": "REST",
"ZURMO_SESSION_ID": tokens["sessionID"],
"ZURMO_TOKEN": tokens["token"]
}
r = requests.post(url=zURL+zInstance, data=data, headers=headers)
我也可以与您分享Zurmo开发人员的回复:
错误的原因是因为您发送到api的数据应该是带有“data”元素的字典,这是我确定基于错误的,所以我认为您应该将代码更改为: data = urllib.urlencode({“data”=> zurmo_data}) 这应该像PHP代码一样: $ response = ApiRestHelper :: createApiCall('http://example.com/index.php/contacts/contact/api/create/';''POST',$ headers,array('data'=> $ data));
在我的代码中, requests.post()方法已经对数据进行了编码,默认情况下它与 urllib.urlencode()的工作方式相同。如果您愿意,可以在此链接中查看Zurmo API:http://zurmo.org/wiki/rest-api-specification-contacts。他们以PHP为例。
最后,我根据我的要求与您分享服务器响应:
200
{"status":"FAILURE","data":null,"message":"Please provide data.","errors":null}
有人经历过同样的事吗?
答案 0 :(得分:5)
您应该使用'data'
密钥创建顶级词典:
data = {'data': data}
这就是开发商的意思;在他们提供的所有PHP示例中,他们将整个data
字典用'data'
键包装在这样的外部字典中。
如果Zurmo API要求您对此进行URL编码,那么您必须手动执行此操作才能实现PHP样式的密钥。请参阅urlencode a multidimensional dictionary in python。
您可以在此处使用multidimensional_urlencode
package来完成此任务:
from multidimensional_urlencode import urlencode
headers = {
"Accept": "application/json",
"ZURMO_API_REQUEST_TYPE": "REST",
"ZURMO_SESSION_ID": tokens["sessionID"],
"ZURMO_TOKEN": tokens["token"],
"Content-Type": "application/x-www-form-urlencoded",
}
post_body = urlencode(data)
r = requests.post(url=zURL+zInstance, data=post_body, headers=headers)
因为您自己编码POST正文,所以需要手动设置Content-Type标题。