CardDAV 从 iCloud 获取所有联系人

Posted

技术标签:

【中文标题】CardDAV 从 iCloud 获取所有联系人【英文标题】:CardDAV get all contacts from iCloud 【发布时间】:2020-03-17 10:44:44 【问题描述】:

我尝试从 iCloud 帐户获取所有联系人...

首先我运行:

<?xml version="1.0" encoding="UTF-8"?>
<d:propfind xmlns:d="DAV:">
    <d:prop>
        <d:current-user-principal/>
    </d:prop>
</d:propfind>

然后我得到 /xxxxxxxxxxx/carddavhome/ 并运行:

<?xml version="1.0" encoding="UTF-8"?>
<d:propfind xmlns:d="DAV:" xmlns:card="urn:ietf:params:xml:ns:carddav">
    <d:prop>
        <card:addressbook-home-set/>
    </d:prop>
</d:propfind>

这给了我 URL https://pXX-contacts.icloud.com:443/xxxxxxxxxxx/carddavhome/ 然后我向这个 URL 发送以下请求:

<?xml version="1.0" encoding="UTF-8"?>
<d:propfind xmlns:d="DAV:" xmlns:card="urn:ietf:params:xml:ns:carddav">
    <d:prop>
        <d:displayname/>
        <d:resourcetype/>
    </d:prop>
</d:propfind>

我得到:

<?xml version="1.0" encoding="UTF-8"?>
<multistatus xmlns="DAV:">
    <response>
        <href>/xxxxxxxxxxx/carddavhome/</href>
        <propstat>
            <prop>
                <resourcetype>
                    <collection/>
                </resourcetype>
            </prop>
            <status>HTTP/1.1 200 OK</status>
        </propstat>

        <propstat>
            <prop>
                <displayname/>
            </prop>
            <status>HTTP/1.1 404 Not Found</status>
        </propstat>
    </response>
</multistatus>

如果我尝试将其运行到 URL https://pXX-contacts.icloud.com:443/xxxxxxxxxxx/carddavhome/contacts

<?xml version="1.0" encoding="UTF-8"?>
<card:addressbook-query xmlns:d="DAV:" xmlns:card="urn:ietf:params:xml:ns:carddav">
    <d:prop>
        <d:getetag/>
        <card:address-data/>
    </d:prop>
</card:addressbook-query>

我得到:遇到格式不正确的 XML,意外的根节点

我的错误是什么?前 2 个查询有效并给了我预期的结果,第 3 个应该给我地址簿和组的列表,第 4 个应该给我所有的 VCard。

【问题讨论】:

【参考方案1】:

对于第一个问题,您没有提供整个 HTTP 请求,但我怀疑您缺少值为 1 的 Depth 标头:

Depth: 1

对于第二个问题,您的 xml 有效负载似乎没有任何问题。另一方面,您的 url 似乎不正确,因为它至少缺少表示集合的结尾斜杠(一些 *DAV 服务器对此更加严格)。希望解决第一个问题后,您可以在查询通讯录时使用正确的 url。

【讨论】:

以上是关于CardDAV 从 iCloud 获取所有联系人的主要内容,如果未能解决你的问题,请参考以下文章

我可以从 iCloud 获取联系人的电子邮件地址吗?

从 iCloud API 获取联系人列表

使用 CardDAV 从 Java 应用程序共享通讯录

iOS 从iCloud中获取文件

从当前 iCloud 用户获取 CloudKit 记录

如何将现有 iCloud 联系人导入 Salesforce。