1

我正在尝试使用 CardDav 从崇光组件系统中检索联系人列表(.vcf 格式)。我已成功将我的代码与其他系统一起使用,但 Sogo 并没有按我的预期工作。我将 URL 设置为:

https://<server>/SOGo/dav/<user>/Contacts/personal/

用户 ID 和密码提供给 libcurl。该命令是带有以下 xml 的 REPORT:

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

对于其他系统,此查询将生成一个包含多个 vcard 条目的文件,这正是我想要的。使用崇光,我得到的只是:

<?xml version="1.0" encoding="utf-8"?>
<D:multistatus xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:carddav">
</D:multistatus>

我注意到对上述 URL 的 PROPFIND 命令会给我一个非常大的文件,其中包含多个 URL,每个联系人条目一个。这些确实有效,但是必须执行可能数千个 GET 来逐一检索它们会慢得多。有人知道我的地址簿查询出了什么问题吗?

相关问题:我想对日历做基本相同的事情(xml 输入略有不同)并且有同样的问题。但是有一个解决方法,我可以对这个 URL 执行 GET:

https://<server>/SOGo/dav/<user>/Calendar/personal.ics

我得到了我想要的整个 .ics 文件。但是,似乎没有可用于联系人的等效 URL - 我错了吗?

4

2 回答 2

1

反向SOGoCardDAV实现对我来说看起来有点 - 让我们说“简单”:

https://github.com/inverse-inc/sogo/blob/907c30061f413fe2d250cddf348db6b4fc26b143/SoObjects/Contacts/SOGoFolder%2BCardDAV.m

虽然如果查询太复杂,它似乎应该返回所有卡片(不是filters provided他们的意思no filters we can handle......):

// If no filters are provided, we return everything.

但是后来这个改动才几个月前才实施,可能你的 SOGo 安装还没有呢?:

https://github.com/inverse-inc/sogo/commit/907c30061f413fe2d250cddf348db6b4fc26b143

2.3.3 (2015-mm-dd)
...
- we now return all cards when we receive an empty addressbook-query REPORT
...

总结:这个特定的查询应该可以在当前的 SOGo (>=2.3.3?) 中工作,尽管实现与 RFC 相距甚远;->


*话虽如此*:这取决于您的客户端类型,但您所做的并不常见(使用“地址簿查询”来获取所有卡片)。该查询仅对没有本地存储的 Web 客户端才真正有意义。常规同步客户端通常使用 WebDAV `sync-report` 来保存 etags/URL 列表,然后使用 WebDAV `multiget` REPORT 来获取更改的项目。

我注意到上述 URL 的 PROPFIND 命令会给我一个非常大的文件,其中包含多个 URL,每个联系人条目一个。这些确实有效,但是必须执行可能数千个 GET 来一一检索它们会慢得多

您可以使用 PROPFIND 来获取所有 URL,然后使用上面提到GET的一个或一批multigetREPORT 而不是单个的。我说“一批”,因为在单个 HTTP 请求中获取所有 vCard 通常会给非流式服务器带来很大的负载/内存压力(很多人不确定 SOGo - 可能是流式服务器)。

如上所述,PROPFIND仍然不推荐使用a。而是使用 async-report仅获取已更改的 URL(第一个响应将很大,但随后仅传输差异)。

相关问题:我想对日历做基本相同的事情(xml 输入略有不同)并且有同样的问题。

您需要提供 XML。尽管与上述相同。Acalendar-query通常不用于获取所有事件。将 async-report与 a 结合使用multiget

我不认为 SOGo 中的联系人文件夹上定义了 GET,而且我认为这对于一般的 CardDAV 服务器来说非常罕见(不同于 CalDAV 的服务器)。

于 2016-01-23T14:46:03.463 回答
0

Sogo 群件系统不是符合标准的 CardDAV 服务器。但是,您可以使用 WebDAV 客户端连接到 CardDAV 通讯簿并将其作为文件夹打开。该文件夹包含单独的 vCard 文件(即使它们可能没有 vcf 扩展名),并且可以下载这些文件,然后将其导入另一个地址簿。

于 2017-05-14T10:46:32.503 回答