Получение атрибутов "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>