实施Card-CalDAV客户端

时间:2015-06-18 09:12:22

标签: caldav carddav

我被要求开发一个可以与我公司的Card- / CalDAV-Server(Kerio Connect)交谈的网络应用程序。我花了几个小时试图找到一个合适的图书馆,但似乎并没有一个功能齐全的图书馆。 Milton看起来很棒,但它是用JAVA写的,我和我的同事都没有用过。

相反,我可能不得不自己写一些东西,最好用PHP或JavaScript。我的问题是;怎么样?我真的很喜欢整个基于http的方式,但除了RFC之外,还有很少的文档可供查找。虽然我确实设法让我的一些卷曲请求得到解答,但其他人在我没理解原因的情况下失败了:

curl -X PROPFIND -u username@domain.tld:password -H "Content-Type: text/xml" -H "Depth: 1" --data "<propfind xmlns='DAV:'><prop><displayname /></prop></propfind>" http://webmail.domain.tld/carddav/users/domain.tld/.public

这很有效。我得到一个回复​​,其中包含&#34;公共文件夹(domain.tld)&#34;,这就是我要求的内容。

curl -X PROPFIND -u username@domain.tld:password -H "Content-Type: text/xml" -H "Depth: 1" --data "<propfind xmlns='DAV:'><prop><addressbook-home-set xmlns="urn:ietf:params:xml:ns:carddav"/></prop></propfind>" http://webmail.domain.tld/carddav/users/domain.tld/.public

另一方面,这个返回403 - 禁止。

这两个请求在某些方面可能都是错误的 - 它们只是我设法拼凑的东西。

那我该如何处理呢?从上到下阅读RFC是否最好?到目前为止,它们并没有那么有用。

修改

我已经阅读了sabre.io上的这两篇文章。他们确实在一定程度上帮助了我。但是,我仍然无法获得实际的联系人数据。我已经设法获得了包含UUID的摘要,但是我不知道如何使用这些UUID,

此外,两篇文章都没有详细说明事情应该如何运作。例如,首先与CardDAV相关的文章指出必须为后续请求存储ctag ,然后,仅在几行后,它提到服务器可能不支持它一点都没有。再往下,我了解到ctag应该是一个标签,让我知道服务器上是否有变化; 这是ctag的目的。每当地址簿中的任何内容发生变化时,ctag也必须更改。那么......,当我的服务器不支持时会发生什么?我怎么知道它是否有效?请求它只会产生一个403 - 禁止。

这是我正在使用的请求;

curl -X PROPFIND -u username@domain.tld:password -H "Content-Type: text/xml" --data "<d:propfind xmlns:d="DAV:" xmlns:cs="http://calendarserver.org/ns/"><d:prop><cs:getctag /></d:prop></d:propfind>" https://domain.tld/carddav/users/domain.tld/.public/

为了获得上述公共地址簿的摘要,我使用了

curl -X REPORT -u username@domain.tld:password -H "Content-Type: text/xml" --data "<c:addressbook-query xmlns:d='DAV:' xmlns:c='urn:ietf:params:xml:ns:carddav'><d:prop><c:address-data></c:address-data></d:prop></c:addressbook-query>" https://domain.tld/public-contacts/domain.tld/

1 个答案:

答案 0 :(得分:1)

SabreDAV网站上有一篇关于如何编写CalDAV和CardDAV客户端的文章:Building a CalDAV client

此外,SabreDAV可能有很多代码需要在PHP中实现DAV客户端。其他库实现列在CalConnect CalDAV website