2017-05-31 66 views
0

我正在嘗試使用沙丁魚查詢Apple iCloud日曆。但是,在我看來,沙丁魚沒有正確解析響應。無法讓沙丁魚解析CalDav響應

這是我CalDav的時間範圍查詢:

<?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/> 
    </d:prop> 
    <c:filter> 
    <c:comp-filter name="VCALENDAR"> 
     <c:comp-filter name="VEVENT"> 
     <c:time-range start="20170501T000000Z" end="20170630T000000Z"/> 
     </c:comp-filter> 
    </c:comp-filter> 
    </c:filter> 
</c:calendar-query> 

射擊時使用HTTP客戶端(失眠)這個查詢,我得到我和我的3個測試事件的答覆,沒有任何問題。請注意,我刪除了日曆數據的一部分,使之短):

<?xml version='1.0' encoding='UTF-8'?> 
<multistatus 
    xmlns='DAV:'> 
    <response> 
     <href>/2003926771/calendars/home/DF4C980C-C189-4DAB-80CE-991A4636593D.ics</href> 
     <propstat> 
      <prop> 
       <getetag>"[email protected]=974e7f83-44fb-4eb2-8386-46012509f5af"</getetag> 
       <calendar-data 
        xmlns='urn:ietf:params:xml:ns:caldav'> 
        <![CDATA[BEGIN:VCALENDAR 
VERSION:2.0 
BEGIN:VEVENT 
UID:DF4C980C-C189-4DAB-80CE-991A4636593D 
DTSTART;TZID=Europe/Zurich:20170522T150000 
DTEND;TZID=Europe/Zurich:20170522T160000 
SUMMARY:Test event 
END:VEVENT 
END:VCALENDAR 
]]> 
       </calendar-data> 
      </prop> 
      <status>HTTP/1.1 200 OK</status> 
     </propstat> 
    </response> 
    <response> 
     <href>/2003926771/calendars/home/4A9F9785-A8A4-4E61-A600-D5A5C041950E.ics</href> 
     <propstat> 
      <prop> 
       <getetag>"[email protected]=974e7f83-44fb-4eb2-8386-46012509f5af"</getetag> 
       <calendar-data 
        xmlns='urn:ietf:params:xml:ns:caldav'> 
        <![CDATA[BEGIN:VCALENDAR 
VERSION:2.0 
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN 
BEGIN:VEVENT 
UID:4A9F9785-A8A4-4E61-A600-D5A5C041950E 
DTSTART;TZID=Europe/Zurich:20170601T120000 
DTEND;TZID=Europe/Zurich:20170601T130000 
SUMMARY:test event in June 
END:VEVENT 
END:VCALENDAR 
]]> 
       </calendar-data> 
      </prop> 
      <status>HTTP/1.1 200 OK</status> 
     </propstat> 
    </response> 
    <response> 
     <href>/2003926771/calendars/home/33D1A876-87E6-4165-8AE6-EDD2FA588964.ics</href> 
     <propstat> 
      <prop> 
       <getetag>"[email protected]=974e7f83-44fb-4eb2-8386-46012509f5af"</getetag> 
       <calendar-data 
        xmlns='urn:ietf:params:xml:ns:caldav'> 
        <![CDATA[BEGIN:VCALENDAR 
VERSION:2.0 
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN 
BEGIN:VEVENT 
UID:33D1A876-87E6-4165-8AE6-EDD2FA588964 
DTSTART;TZID=Europe/Zurich:20170530T120000 
DTEND;TZID=Europe/Zurich:20170530T130000 
LAST-MODIFIED:20170530T071831Z 
SUMMARY:another test event 
END:VEVENT 
END:VCALENDAR 
]]> 
       </calendar-data> 
      </prop> 
      <status>HTTP/1.1 200 OK</status> 
     </propstat> 
    </response> 
</multistatus> 

然而,當我經歷了沙丁魚報告發送完全相同的查詢,我不能夠讀取calendat-data內容。

更詳細地說,在執行下面的代碼時,getAny返回一個空列表。根據我的谷歌研究,這應該包含prop下的xml節點列表(除了一些預先定義的節點,存儲在Prop下的不同對象下,如etag)。

@Override 
public List<VEvent> fromMultistatus(Multistatus multistatus) { 
    List<VEvent> events = new ArrayList<>(multistatus.getResponse().size()); 
    for (Response response : multistatus.getResponse()) { 
     for (Propstat propstat : response.getPropstat()) { 
      System.out.println(propstat.getProp().getAny().get(0).getFirstChild().getTextContent());     
     } 
    } 
    return events; 
} 

我甚至調試了包含響應的整個multistatus對象。沒有我的日曆數據信號。

+0

什麼是沙丁魚? – hnh

+0

[沙丁魚](https://github.com/lookfirst/sardine)是一個Java WebDav客戶端庫。 我在找Java庫來訪問基於CalDav的服務器時發現它。由於caldav4j似乎有些過時並且不再被維護,於是決定在協議方面「下一級」並尋找WebDav庫。在[Apache's Jack Rabbit wiki](https://wiki.apache.org/jackrabbit/WebDAV)中發現了一個使用Sardine的建議。 –

+0

忘了提及,我還在另一篇文章中發現了它,在這篇文章中,您幫助了另一位也在使用沙丁魚的開發人員。 [鏈接到帖子](https://stackoverflow.com/questions/38057038/using-sardines-report-method-to-query-events-from-caldav-server) –

回答

0

對不起,故障是我的。我打電話這個網址在我的測試與失眠:

https://pxx-caldav.icloud.com:443/principal/calendars/

,並呼籲這在我的沙丁魚測試:

https://pxx-caldav.icloud.com:443/principal/calendars/home/

當調用home子日曆(是正確的名稱? )我沒有得到任何活動。

儘管這帶來了另一個問題,就像我無法查詢包含我的測試事件的子日曆,但無論如何,這解決了爲什麼我沒有使用沙丁魚檢索我的測試事件的具體問題。

+0

CalDAV不幸的是不支持嵌套日曆,那裏只是日曆首頁中的平面日曆。因此,沒有'子日曆',只是日曆;-) – hnh