2016-05-08 3 views
1

Я пытаюсь создать HTTP-запрос для получения событий из iCloud Calendar. Я могу получить информацию о календаре (через PROPFIND) и получить информацию о одном событии календаря с помощью его идентификатора события (GET), но не могу написать запрос, который возвращает события календаря в течение заданного временного диапазона.CalDAV Request to gGt iCloud Календарь События

Может ли кто-нибудь увидеть, что я делаю неправильно в коде ниже? Единственный ответ, который я получаю (код 207). В календаре в пределах таймфрейма есть одно событие.

<multistatus xmlns="DAV:"/> 

От:

REPORT /<ICLOUD_USER_ID>/calendars/<ICLOUD_CALENDAR_ID>/ HTTP/1.1 
Authorization: Basic <AUTHDATA> 
Depth: 2 
Prefer: return-minimal 
Host: p31-caldav.icloud.com 
Connection: close 
User-Agent: Paw/2.2.2 (Macintosh; OS X/10.11.2) GCDHTTPRequest 
Content-Length: 367 

<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="20160524T000000Z" end="20160526T000000Z" /> 
      </c:comp-filter> 
     </c:comp-filter> 
    </c:filter> 
</c:calendar-query> 

Заранее спасибо,

Джейми


Edit: запрос ГЭТ, что делает работу:

Запрос:

GET /<ICLOUD_USER_ID>/calendars/<ICLOUD_CALENDAR_ID>/<ICLOUD_EVENT_ID>.ics HTTP/1.1 
Authorization: Basic <AUTHDATA> 
Depth: 1 
Prefer: return-minimal 
Host: p31-caldav.icloud.com 
Connection: close 
User-Agent: Paw/2.2.2 (Macintosh; OS X/10.11.2) GCDHTTPRequest 

Ответ:

BEGIN:VCALENDAR 
VERSION:2.0 
PRODID:-//Apple Inc.//Mac OS X 10.11.2//EN 
CALSCALE:GREGORIAN 
BEGIN:VTIMEZONE 
TZID:Australia/Sydney 
X-LIC-LOCATION:Australia/Sydney 
BEGIN:STANDARD 
DTSTART:18950201T000000 
RDATE;VALUE=DATE-TIME:18950201T000000 
TZNAME:AEST 
TZOFFSETFROM:+100452 
TZOFFSETTO:+1000 
END:STANDARD 
BEGIN:DAYLIGHT 
DTSTART:19170101T000100 
RDATE;VALUE=DATE-TIME:19170101T000100 
RDATE;VALUE=DATE-TIME:19420101T020000 
RDATE;VALUE=DATE-TIME:19420927T020000 
RDATE;VALUE=DATE-TIME:19431003T020000 
RDATE;VALUE=DATE-TIME:19861019T020000 
RDATE;VALUE=DATE-TIME:20000827T020000 
TZNAME:AEDT 
TZOFFSETFROM:+1000 
TZOFFSETTO:+1100 
END:DAYLIGHT 
BEGIN:STANDARD 
DTSTART:19170325T020000 
RDATE;VALUE=DATE-TIME:19170325T020000 
RDATE;VALUE=DATE-TIME:19420329T020000 
RDATE;VALUE=DATE-TIME:19720227T030000 
RDATE;VALUE=DATE-TIME:19820404T030000 
RDATE;VALUE=DATE-TIME:20060402T030000 
RDATE;VALUE=DATE-TIME:20070325T030000 
TZNAME:AEST 
TZOFFSETFROM:+1100 
TZOFFSETTO:+1000 
END:STANDARD 
BEGIN:STANDARD 
DTSTART:19430328T020000 
RRULE:FREQ=YEARLY;UNTIL=19440325T150000Z;BYDAY=-1SU;BYMONTH=3 
TZNAME:AEST 
TZOFFSETFROM:+1100 
TZOFFSETTO:+1000 
END:STANDARD 
BEGIN:STANDARD 
DTSTART:19710101T000000 
RDATE;VALUE=DATE-TIME:19710101T000000 
TZNAME:AEST 
TZOFFSETFROM:+1000 
TZOFFSETTO:+1000 
END:STANDARD 
BEGIN:DAYLIGHT 
DTSTART:19711031T020000 
RRULE:FREQ=YEARLY;UNTIL=19851026T160000Z;BYDAY=-1SU;BYMONTH=10 
TZNAME:AEDT 
TZOFFSETFROM:+1000 
TZOFFSETTO:+1100 
END:DAYLIGHT 
BEGIN:STANDARD 
DTSTART:19730304T030000 
RRULE:FREQ=YEARLY;UNTIL=19810228T160000Z;BYDAY=1SU;BYMONTH=3 
TZNAME:AEST 
TZOFFSETFROM:+1100 
TZOFFSETTO:+1000 
END:STANDARD 
BEGIN:STANDARD 
DTSTART:19830306T030000 
RRULE:FREQ=YEARLY;UNTIL=19850302T160000Z;BYDAY=1SU;BYMONTH=3 
TZNAME:AEST 
TZOFFSETFROM:+1100 
TZOFFSETTO:+1000 
END:STANDARD 
BEGIN:STANDARD 
DTSTART:19860316T030000 
RRULE:FREQ=YEARLY;UNTIL=19890318T160000Z;BYDAY=3SU;BYMONTH=3 
TZNAME:AEST 
TZOFFSETFROM:+1100 
TZOFFSETTO:+1000 
END:STANDARD 
BEGIN:DAYLIGHT 
DTSTART:19871025T020000 
RRULE:FREQ=YEARLY;UNTIL=19991030T160000Z;BYDAY=-1SU;BYMONTH=10 
TZNAME:AEDT 
TZOFFSETFROM:+1000 
TZOFFSETTO:+1100 
END:DAYLIGHT 
BEGIN:STANDARD 
DTSTART:19900304T030000 
RRULE:FREQ=YEARLY;UNTIL=19950304T160000Z;BYDAY=1SU;BYMONTH=3 
TZNAME:AEST 
TZOFFSETFROM:+1100 
TZOFFSETTO:+1000 
END:STANDARD 
BEGIN:STANDARD 
DTSTART:19960331T030000 
RRULE:FREQ=YEARLY;UNTIL=20050326T160000Z;BYDAY=-1SU;BYMONTH=3 
TZNAME:AEST 
TZOFFSETFROM:+1100 
TZOFFSETTO:+1000 
END:STANDARD 
BEGIN:DAYLIGHT 
DTSTART:20011028T020000 
RRULE:FREQ=YEARLY;UNTIL=20071027T160000Z;BYDAY=-1SU;BYMONTH=10 
TZNAME:AEDT 
TZOFFSETFROM:+1000 
TZOFFSETTO:+1100 
END:DAYLIGHT 
BEGIN:STANDARD 
DTSTART:20080406T030000 
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 
TZNAME:AEST 
TZOFFSETFROM:+1100 
TZOFFSETTO:+1000 
END:STANDARD 
BEGIN:DAYLIGHT 
DTSTART:20081005T020000 
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=10 
TZNAME:AEDT 
TZOFFSETFROM:+1000 
TZOFFSETTO:+1100 
END:DAYLIGHT 
END:VTIMEZONE 
BEGIN:VEVENT 
CREATED:20160331T004928Z 
UID:86ABADB9-CDC3-45D0-B932-5420DC10390A 
DTEND;TZID=Australia/Sydney:20160425T093000 
SUMMARY:Sample Event 
DTSTART;TZID=Australia/Sydney:20160425T073000 
DTSTAMP:20160509T000541Z 
LAST-MODIFIED:20160408T220749Z 
SEQUENCE:1 
TRANSP:OPAQUE 
X-APPLE-TRAVEL-ADVISORY-BEHAVIOR:AUTOMATIC 
END:VEVENT 
END:VCALENDAR 
+0

Можете ли вы добавить iCalendar мероприятия? Уверены ли, что u запросит правильный календарь? – hnh

+0

Положительно, что я нахожусь в правильном календаре, так как я могу получить одно событие из этого календаря с помощью запроса GET; это просто запросы REPORT, которые, похоже, не работают для меня – Jamie

+0

Добавьте iCalendar, возвращенный GET, на ваш Q – hnh

ответ

1

Там нет такого понятия, как Depth: 2. Вероятно, вы хотите Depth: 1.

Проверил: RFC2518

+0

Изменено на глубину 1, без изменений в результате, но спасибо за обнаружение в любом случае – Jamie

1

Речь идет о реализации календаря провайдера. Тело запроса полностью прекрасное, и, увидев представление события iCalendar, ответ на запрос должен вернуть событие.

Единственное, что я вижу, может быть причиной этого является заголовок Prefer: return-minimal. Обратитесь к The "return-minimal" Preference, чтобы узнать больше об этом. calendar-query REPORT запрашивает только calendar-data. Обычно клиент запрашивает eTags, поэтому он проверяет, есть ли какая-либо разница между объектом календаря и сервером, если есть какой-либо другой объект календаря, тогда клиент отправляет CALDAV:calendar-multiget REPORT с href объектов календаря, которые являются разными.

Попробуйте удаление заголовка Prefer: return-minimal или вместо этого попытаться изменить

<d:prop> 
    <c:calendar-data /> 
</d:prop> 

в

<d:prop> 
    <d:getetag /> 
</d:prop> 

Надеется, что это помогает.

+0

То, что возврат-минимальное является причиной, маловероятно, но просто запрос к этагу - очень хорошее предложение. Вполне возможно, что сервер поддерживает только подмножество свойств для запроса временного диапазона. – hnh

+0

Я знаю, что это вряд ли произойдет, но использование этого заголовка, запрашивающего «данные календаря», не имеет смысла, потому что ответ для этого не будет минимальным вообще. Вот почему я думаю, что он должен либо удалить заголовок, запрашивать «данные календаря», либо запросить «eTags» с тем же заголовком. – aff

+0

Нет смысла указывать заголовок для getetag, так как это свойство «всегда» существует. Это в основном полезно для коллекции календарей, поскольку они имеют менее однородные свойства. – hnh

0

Как и было предложено, попробуйте запросить только etag, а затем использовать ответные URL-адреса для календаря-multiget REPORT.

Я могу рекомендовать вам использовать скрипач или любую другую программу, чтобы вы могли четко видеть запросы и ответы. Также попробуйте просмотреть запросы от других клиентов, например, emClient.

0
Method-: REPORT 
Content type-: application/xml; charset=utf-8 
Header -: Depth : 1 
URL-:GET /<ICLOUD_USER_ID>/calendars/ 
Set credentials 
Following is RequestContent-: 
<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:prop name='SUMMARY'/> 
              <C:prop name='DESCRIPTION'/> 
              <C:prop name='STATUS'/> 
               <C:prop name='TRANSP'/> 
               <C:prop name='ATTENDEE'/> 
              <C:prop name='UID'/> 
              <C:prop name='DTSTART'/> 
              <C:prop name='DTEND'/> 
              <C:prop name='DURATION'/> 
              <C:prop name='RRULE'/> 
              <C:prop name='RDATE'/> 
              <C:prop name='EXRULE'/> 
              <C:prop name='EXDATE'/> 
              <C:prop name='RECURRENCE-ID'/> 
              </C:comp> 
             </C:comp> 
             </C:calendar-data> 
            </D:prop> 
            <C:filter> 
     <C:comp-filter name='VCALENDAR'> 
     <C:comp-filter name='VEVENT'> 
      <C:time-range start='20160524T000000Z' 
         end='20160526T000000Z'/> 
     </C:comp-filter> 
     </C:comp-filter> 
    </C:filter> 
            </C:calendar-query> 

Я думаю, что проблема связана с использованием URL и метода. Использовать URL до календарей i.e/ICLOUD_USER_ID/календари/и метод должен быть ОТЧЕТ.

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