Google CardDAV API地址簿 - multiget返回400 Bad Request

时间:2014-05-19 16:15:15

标签: google-api carddav google-shared-contacts

我试图通过Google的CardDAV API从Google通讯录中检索所有联系人。
根据{{​​3}},这应该通过发送addressbook-multiget REPORT来完成。根据{{​​3}},它应该是这样的:

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>

不幸的是,我经常收到所有(400) Bad Request次请求REPORT 我确实在请求中包含了OAuth2访问令牌和Depth标头设置为1的授权标头,并且我通过HTTPS将其发送到https://www.googleapis.com/carddav/v1/principals/foo@gmail.com/lists/default。我确实可以访问Developer Console中授予的CardDAV API。

有没有人有这个工作和/或有关于我应该采取哪些不同的做法的线索?

2 个答案:

答案 0 :(得分:3)

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>

答案 1 :(得分:1)

你错过了一步。多项目报告将根据资源uris(hrefs)列表检索联系人。见http://tools.ietf.org/html/rfc6352#section-8.7.1

要首先获取href列表,您可以: *发出深度为1的PROPFIND请求,目标是相同的uri(参见http://tools.ietf.org/html/rfc4918#section-9.1) *或发布WebDAV同步报告(http://tools.ietf.org/html/rfc6578)。

WebDAV Sync是首选方法,特别是如果您有大量联系人。