我被要求开发一个可以与我公司的 Card-/CalDAV-Server (Kerio Connect) 通信的 Web 应用程序。在过去的几个小时里,我一直在试图找到一个合适的库,但似乎没有一个可以正常工作且仍在维护的库。Milton 看起来很棒,但它是用 JAVA 编写的,我和我的同事都没有使用过。
相反,我可能不得不自己编写一些东西,最好是用 PHP 或 JavaScript。我的问题是;如何?我真的很喜欢整个东西是如何基于 http 的,但是除了 RFC 之外,几乎找不到文档。虽然我确实设法让我的一些 curl 请求得到了答复,但其他人在我不明白为什么的情况下失败了:
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
这行得通。我收到包含“公共文件夹(domain.tld)”的响应,这就是我所要求的。
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 - Forbidden。
这两个请求在某种程度上可能都是错误的——它们只是我设法拼凑起来的。
那么我该如何处理呢?从上到下阅读 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/