【问题标题】:Updating Zapier Storage programmatically以编程方式更新 Zapier 存储
【发布时间】:2019-03-28 15:35:36
【问题描述】:

我一直在通过 store.zapier.com 端点使用 Zapier 存储 API,并且成功地设置和检索值。但是,我最近发现需要存储更复杂的信息,我希望随着时间的推移进行更新。

我现在存储的数据如下所示:

{
"task_id_1": {"google_id": "google_id_1", "due_on": "2018-10-24T17:00:00.000Z"},
"task_id_2": {"google_id": "google_id_2", "due_on": "2018-10-23T20:00:00.000Z"}, 
"task_id_3": {"google_id": "google_id_3", "due_on": "2018-10-25T21:00:00.000Z"},
}

我想做的是更新任意 task_id_n 的“due_on”子值,而不必删除并再次添加它。阅读 store.zapier.com 上的 API 信息,我看到您可以发送补丁请求并结合特定操作来更好地控制存储的数据。我尝试使用补丁请求和“set_child_value”操作,如下所示:

def update_child(self, parent_key, child_key, child_value):

        header = self.generate_header()

        data = {
            "action" : "set_child_value",
            "data" : {
                "key" :  parent_key,
                "value" : {child_key : child_value}
            }
        }

        result = requests.patch(self.URL, headers=header, json=data)
        return result

当我发送此请求时,Zapier 会以 200 状态代码响应,但存储未更新。有什么想法我可能会错过吗?

【问题讨论】:

    标签: python python-requests zapier


    【解决方案1】:

    Zapier Store 似乎没有在“action”和“data”字段之后验证请求正文。

    当您在"data" 字段设置为数组的情况下发出请求时,您会触发描述数据字段架构的验证错误(这是一种查找 API 文档的方法!smh)。

    在请求正文中,“set_child_value”操作的数据字段架构是:

    {
        "action" : {
            "enum": [
                "delete",
                "increment_by",
                "set_child_value",
                "list_pop",
                "set_value_if",
                "remove_child_value",
                "list_push"
            ]
        },
        "data" : {
            "key" :  {
                "type": "object"
            },        
            "values" : {
                "type": "object"
            }
        }
    }
    

    请注意,它是 "values" 而不是 "value"

    【讨论】:

    • 是的,问题是我没有设置“值”!在我的各种尝试中,我已经能够找到相同的文档,但是不是特别清楚。感谢您指出了这一点。我将选择您的答案,因为它是我问题的正确答案。也就是说,我发现的解决方案更适合我,因为它允许我在一次调用中更新多个值。再次感谢。
    • 不错!很高兴您找到了适合您用例的更好方法。
    【解决方案2】:

    我能够通过将我的请求从 PATCH 修改为 PUT 来更新特定的子值。我不得不取消以下数据结构:

    data = {
                "action" : "set_child_value",
                "data" : {
                    "key" :  parent_key,
                    "value" : {child_key : child_value}
                }
    

    而是将其发送为:

    data = {
                parent_key : {child_key : child_value}
               }
    

    我的更新请求如下所示:

    def update_child(self, parent_key, child_key, child_value):
    
            header = self.generate_header()
    
            data = {
                parent_key : {child_key : child_value}
                }
    
    
            result = requests.put(self.URL, headers=header, json=data)
            return result
    

    从未真正解决我之前尝试的补丁方法的问题,它确实适用于其他 Zapier 存储方法,例如“pop_from_list”和“push_to_list”。无论如何,对于遇到相同问题的任何人来说,这都是一个合适的解决方案。

    【讨论】:

      猜你喜欢
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 2015-06-30
      相关资源
      最近更新 更多