【问题标题】:Google Carddav server returns 400 during initial sync requestGoogle Carddav 服务器在初始同步请求期间返回 400
【发布时间】:2017-10-19 15:39:50
【问题描述】:

在与 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。

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

【问题讨论】:

标签: carddav


【解决方案1】:

根据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,然后根据检索到的同步令牌属性执行同步请求。

【讨论】:

  • 在请求中添加&lt;D:sync-level&gt;1&lt;/D:sync-level&gt; 并没有什么不同。但是,我认为您是正确的 w.r.t.使用 PROPFIND 进行初始同步以获取 etags 和同步令牌。但这很奇怪,因为空同步令牌方法适用于 iCloud 和 Fastmail。
  • 好吧,正如他们所说:“我们还没有实现完整的规范”。他们是认真的;-/
猜你喜欢
  • 1970-01-01
  • 2014-07-07
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多