Zurmo:Python请求 - 数据格式

时间:2014-10-16 09:27:51

标签: python python-requests

我正在尝试使用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}

有人经历过同样的事吗?

1 个答案:

答案 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标题。