我正在尝试使用CardDav从Sogo群件系统中检索联系人列表(.vcf格式)。我已经成功地将我的代码用于其他系统,但是Sogo不能像我期望的那样工作。我将URL设置为:
https://<server>/SOGo/dav/<user>/Contacts/personal/
用户ID和密码提供给libcurl。该命令是REPORT,带有以下xml:
<?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的文件 条目,这是我想要的。有了Sogo,我得到的就是:
<?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,每个联系人条目一个。那些做的 事实上工作,但必须执行可能数千个更慢 GETs逐一检索它们。有没有人知道什么是错的 用我的地址簿查询?
相关问题:我想对日历做同样的事情 (略有不同的xml输入)并有同样的问题。但是有一个 解决方法,因为我可以对此URL执行GET:
https://<server>/SOGo/dav/<user>/Calendar/personal.ics
我得到了我想要的整个.ics文件。然而,似乎没有 我可以用于联系人的等效网址 - 我错了吗?
答案 0 :(得分:1)
反向CardDAV的SOGo实现看起来有点 - 让我说'简单' - 对我来说:
虽然如果查询过于复杂似乎应该返回所有卡片(没有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(&gt; = 2.3.3?),尽管实现仍然远离RFC; - &gt;
说了:这取决于你的客户类型,但你做的很少见(使用addressbook-query
来获取所有卡)。对于没有本地存储的Web客户端,该查询才有意义。
常规同步客户端通常使用WebDAV sync-report
来保留etags / URL列表,然后使用WebDAV multiget
REPORT来获取更改的项目。
我注意到上面URL的PROPFIND命令会给我一个非常大的文件,其中包含多个URL,每个联系人条目一个。实际上这些确实有效,但是执行可能需要数千个GET来逐个检索它们会慢得多
您可以使用PROPFIND获取所有网址,然后使用上面提到的一个或一批GET
个报告来代替单个multiget
。我说'批量',因为在单个HTTP请求中获取所有vCard通常会给非流媒体服务器带来很大的负载/内存压力(许多人不确定SOGo可能是流式传输)。
如上所述,仍然不推荐使用PROPFIND
。而是使用sync-report
来仅获取已更改的URL(第一个响应将很大,但只传输差异)。
相关问题:我想对日历(略微不同的xml输入)做同样的事情并且遇到同样的问题。
您需要提供XML。虽然与上述相同,但适用。 calendar-query
通常不用于获取所有事件。将sync-report
与multiget
结合使用。
我认为在SOGo中的联系人文件夹中没有定义GET,我认为这对于CardDAV服务器来说非常罕见(与CalDAV服务器不同)。
答案 1 :(得分:0)
Sogo群件系统不是符合标准的CardDAV服务器。但是,您可以使用WebDAV客户端连接到CardDAV地址簿,并将其作为文件夹打开。该文件夹包含单独的vCard文件(即使它们可能没有vcf扩展名),文件可以下载然后导入到另一个地址簿中。