2013-11-18 2 views
4

Я пытаюсь быстро найти свободное время, извлекая события календаря для календаря iCloud через CalDAV. Я могу получить доступные календари и в соответствии с документацией here или с использованием DAViCal client library выборка информации календаря для заданного диапазона дат должна быть такой же простой, как отправка этого запроса xml-запроса в URL-адрес календаря (то есть https://caldav.icloud.com/..userid../calendars/work/):Чтение данных календаря Apple/iCloud с использованием PHP/CalDAV

<c:calendar-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:caldav"> 
<d:prop> 
    <d:getetag /> 
    <c:calendar-data /> 
</d:prop> 
<c:filter> 
    <c:comp-filter name="VCALENDAR"> 
     <C:comp-filter name="VEVENT"> 
      <C:time-range start="20131115T000000Z" end="20131201T000000Z"/> 
      </C:comp-filter> 
</c:comp-filter> 
</c:filter> 
</c:calendar-query> 

который по существу то, что делает функция GetEvents() в библиотеке DAViCal. Тем не менее, я просто получаю URL для каждой записи календаря в ответ, а не сам календарь данных:

<?xml version='1.0' encoding='UTF-8'?><multistatus xmlns='DAV:'> 
    <response> 
<href>/..userid../calendars/work/8D2D90EB-BD23-4137-AD22-70D971C587F2.ics</href> 
<propstat> 
    <prop> 
    <getetag>"[email protected]=b09ce345-d654-491e-bb4a-55358e7019d9"</getetag> 
    <getcontenttype>text/calendar</getcontenttype> 
    </prop> 
    <status>HTTP/1.1 200 OK</status> 
</propstat> 
</response> 
<response> 
<href>/..userid../calendars/work/AA2385AB-EA58-4625-AF87-6D4FB9405686.ics</href> 
<propstat> 
    <prop> 
    <getetag>"[email protected]=b09ce345-d654-491e-bb4a-55358e7019d9"</getetag> 
    <getcontenttype>text/calendar</getcontenttype> 
    </prop> 
    <status>HTTP/1.1 200 OK</status> 
</propstat> 
</response> 
... 
</multistatus> 

Я могу, конечно, сделать запрос GET для каждого отдельного элемента календаря, но очевидно, что это довольно медленно , Есть ли уловка для получения данных календаря, загруженных по одному запросу?

+0

Независимо от того, как события не опрашиваются ничего, кажется, возвращая фактические данные календаря наряду с HREF-х отдельных элементов календаря. Эта библиотека отлично разбиралась в результатах отдельных запросов GET: http://kigkonsult.se/iCalcreator/docs/using.html#selectComponents после использования '$ vcalendar-> parse ($ data)' –

ответ

4

Это работает, если вы просто включить

<c:calendar-data /> 

и НЕ

<d:getetag /> 

в запросе, например:

<c:calendar-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:caldav"> 
<d:prop> 
    <c:calendar-data /> 
</d:prop> 
<c:filter> 
    <c:comp-filter name="VCALENDAR"> 
     <C:comp-filter name="VEVENT"> 
      <C:time-range start="20131115T000000Z" end="20131201T000000Z"/> 
      </C:comp-filter> 
</c:comp-filter> 
</c:filter> 
</c:calendar-query> 

:-)

+0

Отлично работает, спасибо! Я использовал учебные пособия, такие как https://code.google.com/p/sabredav/wiki/BuildingACalDAVClient#Downloading_objects, которые указали, что запрос обоих данных etag и календаря возвратит их, но я думаю, что не для реализации CalDAV от Apple :) –

0

Теперь, яблоко сервер календаря поддерживает бот h.

Iam используя календарь сервер 9.0.

<?xml version="1.0" encoding="utf-8" ?> 
<C:calendar-query 
    xmlns:D="DAV:" 
    xmlns:C="urn:ietf:params:xml:ns:caldav"> 
    <D:prop> 
     <D:getetag /> 
     <C:calendar-data> 
      <C:comp name="VCALENDAR"> 
       <C:prop name="VERSION"/> 
       <C:comp name="VEVENT"></C:comp> 
      </C:comp> 
      <C:expand start="20170101T060000Z" end="20170630T060000Z"/> 
     </C:calendar-data> 
    </D:prop> 
    <C:filter> 
     <C:comp-filter name="VCALENDAR"> 
      <C:comp-filter name="VEVENT"> 
       <C:time-range end="20170630T060000Z" start="20170101T060000Z"/> 
      </C:comp-filter> 
     </C:comp-filter> 
    </C:filter> 
</C:calendar-query> 

Response -

<?xml version='1.0' encoding='UTF-8'?> 
<multistatus xmlns='DAV:'> 
    <response> 
    <href>/calendars/users/test/calendar/43fdddd1-ad3a-4c00-ac63-a76d89e074da.ics</href> 
    <propstat> 
     <prop> 
     <getetag>"14db35d8d385ee62ced664efd56d3ac4"</getetag> 
     <calendar-data xmlns='urn:ietf:params:xml:ns:caldav'><![CDATA[BEGIN:VCALENDAR 
VERSION:2.0 
BEGIN:VEVENT 
UID:43fdddd1-ad3a-4c00-ac63-a76d89e074da 
DTSTART;VALUE=DATE:20170110 
DTEND;VALUE=DATE:20170111 
CATEGORIES:Birthday 
CREATED:20170130T070433Z 
DESCRIPTION:Birthday from thunderbird 
DTSTAMP:20170130T070515Z 
LAST-MODIFIED:20170130T070515Z 
SUMMARY:Test Event 123 
TRANSP:TRANSPARENT 
END:VEVENT 
END:VCALENDAR 
]]></calendar-data> 
     </prop> 
     <status>HTTP/1.1 200 OK</status> 
    </propstat> 
    </response> 
    <response> 
    <href>/calendars/users/test/calendar/53f7e764-9e46-4f7d-a851-714f9ea03ad1.ics</href> 
    <propstat> 
     <prop> 
     <getetag>"e08f17f5f7483d31017c5391a7618d9b"</getetag> 
     <calendar-data xmlns='urn:ietf:params:xml:ns:caldav'><![CDATA[BEGIN:VCALENDAR 
VERSION:2.0 
BEGIN:VEVENT 
UID:53f7e764-9e46-4f7d-a851-714f9ea03ad1 
DTSTART:20170112T093000Z 
DTEND:20170112T103000Z 
CREATED:20170130T092637Z 
DESCRIPTION:Time based Event 
DTSTAMP:20170130T092651Z 
LAST-MODIFIED:20170130T092651Z 
SUMMARY:Time based Event 
TRANSP:OPAQUE 
END:VEVENT 
END:VCALENDAR 
]]></calendar-data> 
     </prop> 
     <status>HTTP/1.1 200 OK</status> 
    </propstat> 
    </response> 
    <response> 
    <href>/calendars/users/test/calendar/73a21941-ac24-492a-b00e-48d38feb7d01.ics</href> 
    <propstat> 
     <prop> 
     <getetag>"8bceb0306b81b67a8dfb2f5d95d76dd1"</getetag> 
     <calendar-data xmlns='urn:ietf:params:xml:ns:caldav'><![CDATA[BEGIN:VCALENDAR 
VERSION:2.0 
BEGIN:VEVENT 
UID:73a21941-ac24-492a-b00e-48d38feb7d01 
DTSTART;VALUE=DATE:20170111 
DTEND;VALUE=DATE:20170112 
CATEGORIES:Favorites 
CREATED:20170130T073845Z 
DESCRIPTION:Duration Event Desc 
DTSTAMP:20170130T092634Z 
LAST-MODIFIED:20170130T092634Z 
SEQUENCE:1 
SUMMARY:Duration Event 
TRANSP:TRANSPARENT 
X-MOZ-GENERATION:1 
END:VEVENT 
END:VCALENDAR 
]]></calendar-data> 
     </prop> 
     <status>HTTP/1.1 200 OK</status> 
    </propstat> 
    </response> 
</multistatus> 
+0

Может быть, дроссель для этого запроса? Иногда я получаю и то, и другое, иногда только этические данные. – Marco

Смежные вопросы