Получение ошибок" if-Match или If-None-Match header или entry etag attribute required " при пакетном удалении контактов

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

Я думаю, что проблема началась, когда мне пришлось включить 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
)

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

EDIT 2:

С помощью Batch метод force=True (который просто добавляет If-Match: * header) - тот же результат.

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

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

3 ответов


копирование ответа из билета кода 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')

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

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


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

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