Получение атрибутов "If-Match" или "If-None-Match" или атрибута "etag" атрибута "при удалении пакетов

Я использую библиотеку Python gdata для удаления удаленных контактов, и я просто получаю ошибку "If-Match или If-None-Match header или entry etag attribute".

Я думаю, что проблема возникла, когда мне пришлось включить API-интерфейс "Контакты" в консоли (который до нескольких дней назад не требовался?).

ИЗМЕНИТЬ

Фактически это не срабатывает как для обновления, так и для удаления операций. Загруженная вставка отлично работает.

Пробовал задавать заголовок If-Match, но он все еще не работает:

custom_headers = atom.client.CustomHeaders(**{'If-Match': '*'})
request_feed = gdata.contacts.data.ContactsFeed()
request_feed.AddDelete(entry=contact, batch_id_string='delete')
response_feed = self.gd_client.ExecuteBatch(
        request_feed,
        'https://www.google.com/m8/feeds/contacts/default/full/batch',
        custom_headers=custom_headers
)

Также создан билет на странице проекта, но я сомневаюсь, что он привлечет к нему внимание.

ИЗМЕНИТЬ 2:

Использование метода Batch с force=True (который просто добавляет заголовок If-Match: *) - это тот же результат.

response_feed = self.gd_client.Batch(
    request_feed,
    uri='https://www.google.com/m8/feeds/contacts/default/full/batch',
    force=True
)

* Может ли кто-нибудь проверить это? Мне никогда не приходилось включать его в консоль раньше, и мое приложение не могло использовать API контактов без проблем, и я считаю, что он даже не был доступен раньше. Я был удивлен, увидев это вчера.

Ответ 1

Копирование ответа из кодового билета Google.

В принципе, вам нужно исправить клиентский метод Post, чтобы немного изменить канал запроса. Здесь один из способов сделать это без непосредственной модификации источника библиотеки:

def patched_post(client, entry, uri, auth_token=None, converter=None, desired_class=None, **kwargs):
    if converter is None and desired_class is None:
        desired_class = entry.__class__
    http_request = atom.http_core.HttpRequest()
    entry_string = entry.to_string(gdata.client.get_xml_version(client.api_version))
    entry_string = entry_string.replace('ns1', 'gd')  # where the magic happens
    http_request.add_body_part(
        entry_string,
        'application/atom+xml')
    return client.request(method='POST', uri=uri, auth_token=auth_token,
                          http_request=http_request, converter=converter,
                          desired_class=desired_class, **kwargs)

# when it comes time to do a batched delete/update,
# instead of calling client.ExecuteBatch, instead directly call patched_post
patched_post(client_instance, entry_feed, 'https://www.google.com/m8/feeds/contacts/default/full/batch')

Ответ 2

В билете, указанном в исходном сообщении, есть обновленная информация и временная работа, которая позволяет успешному удалению пакетов. Пока это работает для меня!

http://code.google.com/p/gdata-python-client/issues/detail?id=700

Ответ 3

Вы также можете указать атрибут etag, чтобы обойти его. Это работает в полезной нагрузке пакетного запроса:

  <entry   gd:etag="*"  >
     <batch:id>delete</batch:id>
     <batch:operation type="delete"/>
     <id> urlAsId </id>
  </entry>