通过SendGrid API更新SendGrid联系人自定义字段,为什么不起作用?

15

我正在尝试更新SendGrid联系人,但无法弄清楚为什么我的自定义字段更新不起作用。我的保留字段(first_name、last_name、email)会更新,但我的自定义字段却没有。有任何想法吗?

文档在这里:https://sendgrid.api-docs.io/v3.0/contacts/add-or-update-a-contact

    try:
        headers = {
            'authorization': f"Bearer {settings.SENDGRID_API_KEY}",
        }
        data = {
            "list_ids": [
                # "Users" list
                "7c2...d20"
            ],
            "contacts": [{
                "email": user.email,
                "first_name": user.first_name,
                "last_name": user.last_name,
                "custom_fields": {
                    "educator_role": user.educator_role,
                }
            }]
        }

        response = requests.put("https://api.sendgrid.com/v3/marketing/contacts", headers=headers, data=json.dumps(data))
        if(response.status_code != 202):
            capture_message(f"Could not add user with email {user.email} to Sendgrid.", level="error")
    except:
        capture_message(f"Adding/updating SendGrid contact failed for {user.email}.", level="error")```

4
很令人震惊的是文档中完全没有提到这一点。在同一主题上,发现了这个GitHub讨论串,交叉链接... https://github.com/sendgrid/sendgrid-nodejs/issues/953 - doublejosh
2个回答

27
与保留字段不同,更新自定义字段需要在调用中传递自定义字段的id而非字段name。因此,不要使用educator_role,而是使用该字段的id,它将是类似于e1_T这样的随机字符串。

您可以通过/marketing/field_definitions端点获取id。


哇,太棒了!现在不能测试,但我会把它添加到我的Jira板上,以备将来之需。谢谢! - Nicole Hemenway
1
多么奇怪的API啊。我在Sendgrid仪表板中按名称定义了一个自定义字段,然后它没有在任何地方显示给我一个ID,现在我必须调用一个端点来找出它。我真的不明白为什么他们不允许使用字段名称并将其映射到内部ID。即使指定名称时只有一个目标,暴露内部细节似乎是一个糟糕的设计选择。 - Thijs Koerselman
我有一个生产账户和一个开发账户。根据字段定义的顺序,两者的字段名称将有不同的ID。太棒了:\ - Thijs Koerselman
1
天哪,我真的受夠了 Sendgrid 的 API 是如此反向、混亂或只是純粹的謊言。我找到了一個完全不同的 API 頁面來獲取自定義字段,但這不是它。謝謝。 - Richard
1
幸运的是,当您在自定义字段页面时,您也可以查看浏览器控制台,并找到对https://api.sendgrid.com/v3/marketing/field_definitions的请求,您将在响应数据中看到自定义字段ID。 - Spencer Williams

1

正如@Matt所说,通过SendGrid API更新自定义字段值时,我们需要通过其ID而不是字段名称来引用自定义字段。
要获取包含您的自定义字段ID的列表,请执行以下操作:

from sendgrid import SendGridAPIClient


SENDGRID_API_KEY="print-your-key-here"

sg = SendGridAPIClient(SENDGRID_API_KEY)
response = sg.client.marketing.field_definitions.get()

print(response.body)

另外,请查看文档:https://docs.sendgrid.com/api-reference/custom-fields/get-all-field-definitions

自定义字段ID具有逻辑性

对于自定义字段,唯一的ID始终以后缀e开头。接着是一个整数,表示在SendGrid平台上创建自定义字段的顺序,例如1, 2, 3。然后是下划线_。接着是代表自定义字段类型的字母:

  • N - 数字
  • T - 文本
  • D - 日期

以下是自定义字段ID列表的示例:

{
    "custom_fields":[
        {"id":"e1_N","name":"number_field_test","field_type":"Number"},
        {"id":"e2_T","name":"text_field_test","field_type":"Text"},
        {"id":"e3_D","name":"data_field_test","field_type":"Date"}
    ]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接