0

在与 Google 的 CardDav 服务器进行初始同步时,我正在使用同步收集方法进行 REPORT 请求。在这个请求中,我传递了空的同步令牌,因为它是初始同步的。这是根据 RFC 6578 ( https://www.rfc-editor.org/rfc/rfc6578#section-3.8 )。

请求正文如下所示:

<?xml version="1.0" ?>
<D:sync-collection xmlns:D="DAV:">
<D:sync-token/>
<D:prop>
    <D:getetag/>
</D:prop>
</D:sync-collection>

我期待所有联系人的 etag 的多状态响应。但是,谷歌返回 HTTP 错误 400。

如果我做错了什么,有人可以吗?

4

1 回答 1

0

根据https://www.rfc-editor.org/rfc/rfc6578#section-6.1 ,您的请求缺少同步级别元素

   <!ELEMENT sync-collection (sync-token, sync-level, limit?, prop)>

Google API 并不完全清楚它们是否支持空同步令牌。

客户端应用程序必须在初始同步后切换到此操作模式。

客户端程序使用通讯簿上的同步令牌 PROPFIND 请求来获取表示其当前状态的同步令牌。客户端应用程序必须存储此值并发出定期同步收集报告请求以确定自上次发出同步令牌以来的更改。已发行的令牌有效期为 29 天,并且 REPORT 响应将包含一个新的同步令牌。

因此,他们很可能因此拒绝了该请求。如果是这种情况,可以使用 Depth:1 执行 PROPFIND 请求同步令牌属性以及 getetag,然后根据检索到的同步令牌属性执行同步请求。

于 2017-10-19T07:39:50.743 回答