使用 CardDAV 协议管理联系人

您可以使用 Google 的 CardDAV 协议查看和管理您的联系人。

联系人存储在用户的 Google 帐号中;大多数 Google 服务都可以访问联系人列表。您的客户端应用可以使用 CardDAV API 创建新联系人、修改或删除现有联系人,以及查询符合特定条件的联系人。

规范

完整规范尚未实现,但 Apple iOSTM 通讯录和 macOS 等许多客户端都应该能够正确互操作。

对于每个相关规范,Google 的 CardDAV 支持如下:

Google 的 CardDAV 需要 OAuth 2.0

Google 的 CardDAV 接口需要使用 OAuth 2.0。请参阅下面链接的文档,了解如何使用 OAuth 2.0 访问 Google API:

连接到 Google 的 CardDAV 服务器

CardDAV 协议支持发现地址簿 URI 和联系人资源 URI。您不得对任何 URI 进行硬编码,因为它们可能会随时发生变化。

客户端应用必须使用 HTTPS,并且必须为用户的 Google 帐号提供 OAuth 2.0 身份验证。CardDAV 服务器不会对请求进行身份验证,除非请求通过 Google 帐号的 OAuth 2.0 身份验证通过 HTTPS 到达,并且您的应用已在 DevOps 控制台中注册。如果您尝试通过基本身份验证或与 Google 帐号不匹配的电子邮件地址/密码通过 HTTP 进行连接,则会产生 HTTP 401 Unauthorized 响应代码。

如需使用 CardDAV,您的客户端程序必须先通过在以下各项上执行 HTTP PROPFIND 来连接到规范发现路径:

https://www.googleapis.com/.well-known/carddav

重定向 (HTTP 301) 到地址簿资源后,您的客户端程序即可对其执行 PROPFIND,以发现 DAV:current-user-principalDAV:principal-URLaddressbook-home-set 属性。然后,您的客户端程序便可以对 addressbook-home-set 执行 PROPFIND,并查找 addressbookcollection 资源,以此发现主地址簿。此流程的完整说明不在本文档的讨论范围内。如需了解详情,请参阅 rfc6352

不得通过针对常用 URI 的 PROPFINDHTTP 301 响应中返回的重定向路径必须永久缓存(如 rfc6764 所示)。设备应定期重新尝试已知 URI 发现,以验证缓存的路径是否仍是最新的,并在路径发生变化时重新同步。Google 建议税率为每 2-4 周一次。

资源

CardDAV 使用 REST 概念。客户端应用根据其 URI 指定的资源执行操作。我们在此处指定当前的 URI 结构,以帮助开发者了解下一部分中的概念。该结构可能会发生更改,且不得硬编码。相反,资源应根据 RFC 进行发现。

  1. 主帐号
    • https://www.googleapis.com/carddav/v1/principals/userEmail
  2. 家居套装
    • https://www.googleapis.com/carddav/v1/principals/userEmail/lists
  3. 地址簿
    • https://www.googleapis.com/carddav/v1/principals/userEmail/lists/default
  4. 联系人
    • https://www.googleapis.com/carddav/v1/principals/userEmail/lists/default/contactId

同步联系人

以下是支持的操作的一般说明。开发者应在相关 RFC 中查找详细信息。请求和响应主要使用 XML 进行编码。以下是客户端应用用于同步的主要操作:

  • 使用 CTag
    • 客户端程序会对地址簿资源使用 getctag PROPFIND 请求,以确定服务器上是否有任何联系人发生更改,从而确定是否需要进行同步。如果有任何联系人发生变化,此属性的值肯定会发生变化。客户端应用应存储此值,并仅在首次同步时使用,并在 sync-token 失效时用作后备值。定期轮询 getctag 属性会导致节流。
  • 使用 sync-token
    • 客户端程序使用地址簿上的 sync-token PROPFIND 请求获取代表其当前状态的 sync-token。客户端应用必须存储此值并定期发出 sync-collection REPORT 请求,以确定自上次发出 sync-token 以来的更改。颁发的令牌的有效期为 29 天,REPORT 响应将包含新的 sync-token
  • 使用 ETag
    • 客户端应用对地址簿资源发出 getetag PROPFIND 请求(DEPTH 标头等于 DEPTH_1)。通过维护每个联系人的 ETag 值,客户端程序可以请求更改 ETag 的联系人的值。
  • 检索联系人
    • 客户端应用通过发出 addressbook-multiget REPORT 请求来检索联系人。根据联系人 URI 列表,报告会以 VCard 3.0 值的形式返回请求的所有联系人。每个条目都包含联系人的 ETag
  • 插入联系人
    • 客户端应用向 VCard 3.0 格式的新联系人发出 POST 请求。响应中将包含新联系人的 ID。
  • 更新联系人
    • 客户端应用使用 VCard 3.0 格式发出包含更新后的联系人的 PUT 请求。如果地址簿中已有该联系人,则系统会更新该联系人。
    • 客户端应用应包含 If-Match,其中包含联系人当前已知的 ETag。如果服务器上的当前 ETag 与客户端程序发送的 ETag 不同,服务器将拒绝 PUT 请求(通过 HTTP 412)。这样可以对更新进行序列化。
  • 删除联系人
    • 客户端应用通过针对联系人 URI 发出 DELETE 请求来删除联系人。