【问题标题】:How to format payload for Kartra API in Python如何在 Python 中格式化 Kartra API 的有效负载
【发布时间】:2021-01-12 18:50:31
【问题描述】:

所以,我正在尝试使用 Python requests.post 对此 Kartra 入站 API 进行 API 发布调用。这是我的 Python 代码:

 payload = { 
    'api_key': settings.KARTRA_API_KEY,
    'api_password': settings.KARTRA_API_PASSWORD,
    'app_id': settings.KARTRA_APP_ID,
    'lead': {
        'email': 'joe@joe.com',
        'first_name': 'Joseph',
        'last_name': 'Smith'
    },
    'actions': {
        '0': {'cmd': 'search_lead'}
    }
}
url = settings.KARTRA_API_URL
response = requests.post(url, data=payload)

我必须遵循的唯一示例是 PHP(我没有使用过)。它是这样的:

curl_setopt($ch, CURLOPT_POSTFIELDS,
http_build_query(
    array(
        'app_id' => 'AIm863DwsOW',
        'api_key' => 'QG9GPLW8G',
        'api_password' => 'kdwFAfwrfVS',
        'lead' => array(
            'id' => '3232323223', //you may pass either ID or EMAIL. If both, the system will pick ID
            'email' => 'JoeSmith@domain.com',     
        ),
        'actions' => array(
            '0' => array(
                   'cmd' => 'search_lead',
             ),
        )
  )

) );

我只能得到这样的错误:

{"status":"Error","message":"'actions' not an array","type":"224"}

我已验证我的密钥和令牌似乎工作正常。

我已经尝试了所有我能想到的让端点将“动作”解释为数组的方法。有人可以让我直截了当吗?非常感谢,因为我已经浪费了几个小时来搞砸这个。

【问题讨论】:

  • 因此,对于可能看到此内容的任何其他人...我一直在 Kartra 的“支持”团队周围,我得到的只是指向我已经阅读的不充分文档的链接和光顾关于让我自己的代码工作是我的责任的讲座!不开玩笑?谢谢,你很有帮助。他们确实指出,在测试模式下,我为上述领导发送的电子邮件必须以 @kartra.com 结尾。试过了,错误是一样的。

标签: python php api curl python-requests


【解决方案1】:

如果错误很简单,如'actions' not an array,那么这可能只意味着一件事——actions aren't given as an array。在 Python 中,数组用[] 方括号括起来,花括号{} 用于dictionary 数据结构。

将动作部分简单地更改为数组应该可以解决问题

'actions': [
    {
        0: {'cmd': 'search_lead'}
    }
]

详细 API 还解释了错误 here 的原因。

【讨论】:

  • 感谢您的回复。首先,不是有效的 Python 语法,所以它不会运行。其次,我查看了引用的页面,它只说该项目不是数组。这是实际错误消息的精确重复。
【解决方案2】:

此 PHP 代码:

       'actions' => array(
            '0' => array(
                   'cmd' => 'search_lead',
             ),

可以解释为listdict,你可以尝试将PHP位“翻译”成这样:

'actions': [
    {
        'cmd': 'search_lead'
    }
]

编辑:。 如果你尝试怎么办:

'actions': [
    {
        0: {'cmd': 'search_lead'}
    }
]

【讨论】:

  • 感谢您的帮助。试了一下,结果完全一样。如果我查看“0”,看起来他们需要它作为数组的键。根据您的建议,我预计 API 会有不同的响应。完全一样。
  • 在这篇文章中添加了另一个尝试@BillHuang
  • 不高兴。我已经尝试了所有这些。甚至无法使用 [] 使其在 Postman 中工作。不知道他们想要什么。也没有帮助的文档。再次感谢您的尝试。我的研究表明,CURL 想要对所有内容进行 urlencode。也试过了。他们将传入或 urlencoded 的 JSON 视为攻击并阻止它。
  • 好吧,对不起,我不是一个很好的帮助,可能值得尝试对有效负载进行 urlencode。但是如果您尝试在requests.post 方法中使用json 参数会怎样? response = requests.post(url, json=payload)
  • 这两个都试过了。没有喜悦。等待听到他们的支持。将更新线程何时我破解这个!再次感谢。
【解决方案3】:

正如我在 cmets 中所说,Kartra 支持无济于事。 Soo... 我将 PHP 示例发送到 https://httpbin.org/post 以了解实际发送的内容。这本身就是一个启示(从来不知道这样的工具)。

这里是 PHP 示例的链接:https://documentation.kartra.com/section-28-php-sample-creating-a-lead/

这是实际发送到 api 的内容:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "actions[0][cmd]": "create_lead", 
    "actions[1][cmd]": "assign_tag", 
    "actions[1][tag_name]": "My customer", 
    "api_key": "QG9GPLW8G", 
    "api_password": "kdwFAfwrfVS", 
    "app_id": "AIm863DwsOW", 
    "lead[custom_fields][0][field_identifier]": "text1", 
    "lead[custom_fields][0][field_value]": "text message", 
    "lead[custom_fields][1][field_identifier]": "dropdown1", 
    "lead[custom_fields][1][field_value]": "612", 
    "lead[custom_fields][2][field_identifier]": "checkbox1", 
    "lead[custom_fields][2][field_value][0]": "620", 
    "lead[custom_fields][2][field_value][1]": "621", 
    "lead[email]": "JoeSmith@domain.com", 
    "lead[first_name]": "Joe", 
    "lead[last_name]": "Smith"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "678", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "X-Amzn-Trace-Id": "Root=1-5f77604a-7b5fee841e85d78f6b352133"
  }, 
  "json": null, 
  "origin": "104.14.117.45", 
  "url": "https://httpbin.org/post"
}

这是用于测试的实际工作 Python 代码:

payload = { 
    'api_key': settings.KARTRA_API_KEY,
    'api_password': settings.KARTRA_API_PASSWORD,
    'app_id': settings.KARTRA_APP_ID,
    'lead[email]': 'joe@kartra.com',
    'lead[first_name]': 'Joe',
    'lead[last_name]': 'Smith',
    'actions[0][cmd]': 'create_lead',
}

url = settings.KARTRA_API_URL
response = requests.post(url, data=payload)

我从中学到的另一点是,requests.post() 库不会在 Python dicts of dicts 的第二级以下进行深度复制。有关更多信息,请参阅我的原始问题...

我真的希望这可以帮助某人避免我必须经历的痛苦来解决这个问题。诚然,如果我对 Python、HTTP 和 PHP 有更多了解,并且没有试图避免站出来测试示例代码,那会更容易。生活和学习!

【讨论】:

  • 这非常有帮助,我的头在桌子上敲了几天,谢谢!
  • 我的荣幸。这让我花了几天时间才弄清楚。我准备尖叫。很高兴我能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 2017-06-22
  • 2019-04-09
相关资源
最近更新 更多