2014-11-05 95 views
1

我正在嘗試使用PHP對Google caldav服務器執行CalDAV XML請求。Google CALDAV XML請求使用curl(php)

出於某種原因,谷歌calDAV記錄很差。

目的是獲取所有事件的列表,包括事件特定的數據。 (例如開始,結束,摘要...)。 目標是儘可能有效地做到這一點(一次請求中的所有事件數據)。

我發現這可以通過REPORT請求來完成。

我使用的代碼是this post

我的確切代碼:

$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請求是從the SabreDAV wiki複製粘貼。

該代碼返回的是「未知錯誤」。 我知道谷歌憑據正在工作,因爲我成功地嘗試了使用SabreDAV的內置請求(例如propfind)的一些請求。但是SabreDAV無法生成報告請求。

所以我認爲必須在xml請求中有一些google caldav無法正確處理的東西。

我已經擺弄了好幾天,但我似乎無法弄清楚一個合適的解決方案。

+0

您需要首先了解有關「未知錯誤」的更多信息。這個消息本身並沒有太多要求。請儘可能具體地提出您的編程問題。 – hakre 2014-11-05 23:44:33

+0

隨機建議。你可以嘗試刪除'Depth'標題嗎?我覺得我記得那可能與它有關,但我不知道... – Evert 2014-11-06 05:07:11

+0

@hakre這個問題簡而言之:我做錯了什麼從谷歌calDAV服務器得到有效的響應?研究並沒有給我太多的「未知錯誤」。 – Rbn 2014-11-06 09:34:15

回答