Программное обновление Zapier Storage

Я работал с api хранилища Zapier через конечную точку store.zapier.com и успешно устанавливал и извлекал значения. Однако недавно я обнаружил необходимость хранить более сложную информацию, которую я хотел бы обновлять с течением времени.

Данные, которые я храню в данный момент, выглядят следующим образом:

{
"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"},
}

Что я хотел бы сделать, так это обновить дочернее значение "due_on" любого произвольного task_id_n, не удаляя и не добавляя его снова. Читая информацию об API на store.zapier.com, я вижу, что вы можете отправить запрос исправления в сочетании с определенным действием, чтобы лучше контролировать сохраненные данные. Я пытаюсь использовать запрос исправления и действие "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, но хранилище не обновляется. Есть идеи, что мне может не хватать?


person Michael Case    schedule 24.10.2018    source источник


Ответы (2)


Zapier Store, похоже, не проверяет тело запроса после полей «действие» и «данные».

Когда вы делаете запрос с полем "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"
        }
    }
}

Обратите внимание, что это «значения», а не «значение».

person Oluwafemi Sule    schedule 26.10.2018
comment
Да, проблема в том, что я не установил значения! Мне удавалось найти ту же самую документацию во время моих различных попыток, но да, это не особенно ясно. Спасибо за указание на это. Я выберу ваш ответ, так как это правильный ответ на мой вопрос. Тем не менее, решение, которое я нашел, мне больше подходит, поскольку оно позволяет мне обновлять несколько значений за один вызов. Спасибо еще раз. - person Michael Case; 26.10.2018
comment
Отлично! Рад, что вы нашли способ лучше, который подходит для вашего случая использования. - person Oluwafemi Sule; 26.10.2018

Мне удалось обновить определенные дочерние значения, изменив свой запрос с 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». В любом случае это подходящее решение для всех, кто сталкивается с той же проблемой.

person Michael Case    schedule 26.10.2018