我使用gdata
Python库进行批量删除的联系人,我只需要获得" If-Match或If-None-Match标题或条目etag属性&#34 ;错误。
我认为问题是在我必须在控制台中启用Contacts 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
)
还在项目页面上创建了ticket,但我怀疑它会引起注意。
编辑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
)
*有人可以验证吗?我之前从未在控制台中启用它,而且我的应用程序能够毫无问题地使用Contacts API,我相信它之前甚至无法使用。昨天我很惊讶。
答案 0 :(得分:4)
从Google代码券中复制答案。
基本上,您需要修补客户端的Post
方法以稍微修改请求Feed。这是一种不直接修改库源的方法:
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')
答案 1 :(得分:1)
原始帖子中引用的故障单有一些更新的信息和临时解决方法,允许批量删除成功。到目前为止,它为我工作了!
http://code.google.com/p/gdata-python-client/issues/detail?id=700
答案 2 :(得分:0)
您还可以指定etag属性来绕过它。这适用于批处理请求有效负载:
<entry gd:etag="*" >
<batch:id>delete</batch:id>
<batch:operation type="delete"/>
<id> urlAsId </id>
</entry>