批量删除联系人时出现“If-Match或If-None-Match header或entry etag attribute required”错误

时间:2014-05-10 03:17:46

标签: python google-api google-contacts

我使用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,我相信它之前甚至无法使用。昨天我很惊讶。

3 个答案:

答案 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>