Google CardDAV API addressbook-multiget返回400个错误请求



我试图通过谷歌的CardDAV API从谷歌联系人检索所有联系人。
根据CardDAV开发者指南,这应该通过发送addressbook-multiget REPORT来完成。根据RFC 6352,它应该看起来像这样:

REPORT https://www.googleapis.com/carddav/v1/principals/foo@gmail.com/lists/default HTTP/1.1
Authorization: Bearer ya29.foo-bar
Depth: 1
Content-Type: text/xml; charset=UTF-8
Host: www.googleapis.com
Content-Length: 204  
<C:addressbook-multiget xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:carddav">
<D:prop>
<D:getetag />
<C:address-data>
<C:prop name="EMAIL"/>
</C:address-data>
</D:prop>
</C:addressbook-multiget>

不幸的是,对于所有REPORT请求,我总是得到(400) Bad Request
我在请求中包含OAuth2访问令牌的授权头和深度头设置为1,我通过HTTPS将其发送给https://www.googleapis.com/carddav/v1/principals/foo@gmail.com/lists/default。我确实可以访问开发者控制台授予的CardDAV API。

有没有人得到这个工作和/或我应该做什么不同的线索?

Google CardDav需要一个Filter元素,但是我发现如果不包含匹配条件,将返回所有条目,并且不需要href:

<?xml version="1.0" encoding="utf-8" ?>
<C:addressbook-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:carddav">
<D:prop>
    <D:getetag />
    <C:address-data />
</D:prop>
<C:filter>
    <C:prop-filter name="FN">
    </C:prop-filter>    
</C:filter>
</C:addressbook-query>

你少了一步。multiget报告将根据资源uri列表(href)检索联系人。看到https://www.rfc-editor.org/rfc/rfc6352 section-8.7.1

要首先获得href的列表,您可以:

  • 发出深度为1的PROPFIND请求,针对相同的uri(参见https://www.rfc-editor.org/rfc/rfc4918#section-9.1)
  • 或发出WebDAV同步报告(https://www.rfc-editor.org/rfc/rfc6578)。

WebDAV Sync是首选的方法,特别是如果你有大量的联系人集合。

最新更新