我正在尝试使用CardDav从Sogo群件系统中检索联系人列表( .vcf格式)。我已经成功地在其他系统中使用了我的代码,但是Sogo不能像我期望的那样工作。我将URL设置为:
https://<server>/SOGo/dav/<user>/Contacts/personal/用户id和密码被提供给libcurl。该命令使用以下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文件。然而,似乎没有一个等效的URL可以用于联系人-我错了吗?
发布于 2016-01-23 22:46:03
对我来说,逆向SOGo的CardDAV实现看起来有点--比如说“简单”--:
虽然它看起来应该返回所有卡片,如果查询太复杂(不是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还很远;->
*话虽如此*:这有点取决于你的客户端类型,但你所做的是相当不常见的(使用addressbook-query来获取所有卡片)。该查询只有在没有本地存储的Web客户端上才有意义。常规同步客户端通常使用WebDAV sync-report来保存etags/URL列表,然后使用WebDAV multiget报告来获取已更改的项。
我注意到上述网址的PROPFIND命令将给我一个非常大的文件,其中包含多个URL,每个联系人条目一个。这些实际上是可以工作的,但是它将会慢得多,可能需要执行数千个GETs来逐个检索它们
您可以使用PROPFIND来抓取所有的GET,然后如上所述的一个或一批multiget报告而不是单个URL。我之所以说“批处理”,是因为在一个HTTP请求中获取所有vCards通常会给非流媒体服务器带来很大的负载/内存压力(很多是,对SOGo不确定--可能是流媒体)。
如上所述,仍然不推荐使用PROPFIND。相反,使用sync-report仅获取已更改的URL(第一个响应将很大,但随后仅传输diffs )。
与
相关的问题:我想对日历做基本上相同的事情(稍有不同的xml输入),并且有相同的问题。
您需要提供XML。虽然同样的事情也适用于上面。calendar-query通常不用于获取所有事件。将sync-report与multiget结合使用。
我不认为在SOGo的联系人文件夹上定义了GET,而且我认为这在一般的CardDAV服务器上是相当不常见的(与CalDAV服务器不同)。
发布于 2017-05-14 18:46:33
Sogo群件系统不是符合标准的CardDAV服务器。但是,您可以使用WebDAV客户端连接到CardDAV通讯簿,并将其作为文件夹打开。该文件夹包含单独的vCards文件(即使它们可能没有vcf扩展名),可以下载这些文件,然后将其导入到另一个通讯簿中。
https://stackoverflow.com/questions/34955255
复制相似问题