我正试图用PHP向google CalDAV服务器发出CalDAV XML请求。
出于某种原因,谷歌calDAV的文档记录非常差。
目的是获取所有事件的列表,包括特定于事件的数据。(例如,开始、结束、总结…)。我们的目标是尽可能有效地做到这一点。(一个请求中的所有事件数据)。
我发现这可以通过REPORT请求来完成。
我正在使用这篇文章中的代码。
我的确切代码:
$xml= '<c:calendar-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:caldav"><d:prop><c:calendar-data /></d:prop></c:calendar-query>';
$url = "https://apidata.googleusercontent.com/caldav/v2/*email*/events";
$user = "**********@gmail.com";
$pw = "*********";
$data = $this->doRequest($user, $pw, $url, $xml);
print_r($data);
}
public function doRequest($user, $pw, $url, $xml)
{
$c=curl_init();
$url = preg_replace('{^https?://[^/]+}', '', $url);
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_HTTPHEADER, array("Depth: 1", "Content-Type: text/xml; charset='UTF-8'", "Prefer: return-minimal"));
curl_setopt($c, CURLOPT_HEADER, 0);
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($c, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($c, CURLOPT_USERPWD, $user.":".$pw);
curl_setopt($c, CURLOPT_CUSTOMREQUEST, "REPORT");
curl_setopt($c, CURLOPT_POSTFIELDS, $xml);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
$data=curl_exec($c);
curl_close($c);
return $data;
}
xml请求是从SabreDAV wiki复制粘贴的。
谷歌在这个代码上返回的是"未知错误"。我知道来自谷歌的凭据正在工作,因为我成功地尝试了一些使用SabreDAV内置请求的请求(例如propfind)。但是SabreDAV无法生成报告请求。
因此,我认为xml请求中一定有一些内容是googlecaldav无法正确处理的。
这件事我已经折腾了好几天了,但我似乎想不出一个合适的解决办法。
好吧,您似乎正在使用Google CalDAV API不允许的HTTP基本Auth:
https://developers.google.com/google-apps/calendar/caldav/v2/guide#connecting_to_googles_caldav_server
然后,您没有指定哪个URL是您请求的目标。