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

Posted

技术标签:

【中文标题】批量删除联系人时出现“If-Match or If-None-Match header or entry etag attribute required”错误【英文标题】:Getting "If-Match or If-None-Match header or entry etag attribute required" errors when batch deleting contacts 【发布时间】:2014-06-27 21:48:46 【问题描述】:

我正在使用gdata Python 库来批量删除联系人,但我只收到“If-Match or If-None-Match header or 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
)

还在项目页面上创建了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
)

* 有人可以验证吗?我以前从未在控制台中启用它,我的应用程序能够毫无问题地使用联系人 API,而且我相信它以前甚至不可用。我昨天看到它很惊讶。

【问题讨论】:

我也面临同样的问题,有关此问题的任何更新 在不了解 gdata 库的详细信息的情况下,您不应该以某种方式将 custom_headers 实例传递给请求吗?或者也许将它安装在gd_client 上?我怀疑它只会通过创建一个 CustomHeaders 实例来添加标题。 啊,不错,不错。那是一个错字。已编辑。 这对您有帮助吗? ***.com/questions/2989257/… 或者这个***.com/questions/20270565/… 【参考方案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>

【讨论】:

以上是关于批量删除联系人时出现“If-Match or If-None-Match header or entry etag attribute required”错误的主要内容,如果未能解决你的问题,请参考以下文章

Java中怎样实现批量删除操作

添加联系人时出现 OperationApplicationException

在 TransactionScope 中批量插入时出现 ORA-00604 错误

从 Azure Blob 存储批量插入时出现 ERRORFILE 问题

检索联系人数据 Android 时出现 RuntimeException

尝试使用 Azure 通知中心批量发送时出现 403 禁止