Получение ошибок" 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>