【问题标题】:Using Sardines report method to query events from CalDAV server使用 Sardines 报告方法从 CalDAV 服务器查询事件
【发布时间】:2016-10-29 15:35:02
【问题描述】:

我正在尝试使用 Sardine(和 biweekly)从 CalDAV 服务器获取事件。获取整个日历对我有用:

Sardine sardine = SardineFactory.begin();
InputStream is = sardine.get(CALDAV_URL_STRING);
ICalendar iCalendar = Biweekly.parse(is).first();

现在我想获取特定时间范围内的事件。根据这篇“Building a CalDAV client”的文章,我认为你应该使用 Sardines report 方法来这样做,对吧?

如果是这样,您应该如何使用该方法? wiki中没有记载,Javadoc也不是很清楚。

我应该自己写SardineReport吗?我看起来应该得到类似的结果:

Sardine sardine = SardineFactory.begin();
SardineReport<List<VEvent>> report = new MyRangeReport(FROM_DATE, END_DATE);
List<VEvent> result = sardine.report(CALDAV_URL_STRING, 1, report);

我在正确的轨道上吗?有人对如何编写自己的沙丁鱼报告有任何指导吗?

【问题讨论】:

    标签: caldav sardine biweekly


    【解决方案1】:

    您是对的,要运行时间范围查询,您需要发出包含 calendar-query 的 HTTP REPORT 请求。您可以在RFC 4719 Section 7.8.1 中找到样本。我不认识沙丁鱼,但是是的,report 听起来不错 ;-)

    进一步简化:

     REPORT /bernard/work/ HTTP/1.1
     Host: cal.example.com
     Depth: 1
     Content-Type: application/xml; charset="utf-8"
     Content-Length: xxxx
    
     <?xml version="1.0" encoding="utf-8" ?>
     <calendar-query xmlns:D="DAV:" xmlns="urn:ietf:params:xml:ns:caldav">
       <D:prop>
         <D:getetag/>
         <calendar-data />
       </D:prop>
       <filter>
         <comp-filter name="VCALENDAR">
           <comp-filter name="VEVENT">
             <time-range start="20060104T000000Z" end="20060105T000000Z"/>
           </comp-filter>
         </comp-filter>
      </filter>
    </calendar-query>
    

    我应该编写自己的 SardineReport 吗?

    看起来,扫描沙丁鱼的 GitHub,它似乎不包括 CalDAV 查询。您可能可以根据他们的 SyncCollectionReport.java.

    请注意,对 calendar-query REPORT 的响应只是常规的 WebDAV 207 multi-status 响应。不需要额外的东西。 (Result 对象与 SyncCollectionReport 中的对象相同,但没有额外的同步令牌)。

    【讨论】:

    • 谢谢!我已经编写了自己的报告类来返回结果。我开始怀疑 Radicale(我们正在使用的服务器)是否支持 time-range 过滤器。
    • 我不知道,但this answer 建议它不知道。检查评论:“问题出在 Radicale。切换到 SabreDAV,现在它可以工作了”
    • 谢谢。我认为我们需要检查一下 sabre/dav。为了文档起见,我添加了我的报告类。
    【解决方案2】:

    我已经实现了一个可以工作的报告类,但是 Radicale 返回的结果似乎不正确。看起来 Radicale 不支持 time-range 过滤器。

    关于它的价值,以下是报告的相关部分:

    public class VEventsTimeRangeSardineReport extends SardineReport<List<VEvent>>
    {
    
        ...
    
        @Override
        public String toXml() throws IOException
        {
            // Hardcode for now
            String xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" +
                         "<c:calendar-query xmlns:d=\"DAV:\" xmlns:c=\"urn:ietf:params:xml:ns:caldav\">\n" +
                         "  <d:prop>\n" +
                         "    <c:calendar-data/>\n" +
                         "    <d:getetag/>\n" +
                         "  </d:prop>\n" +
                         "  <c:filter>\n" +
                         "    <c:comp-filter name=\"VCALENDAR\">\n" +
                         "      <c:comp-filter name=\"VEVENT\">\n" +
                         "        <c:time-range start=\"%s\" end=\"%s\"/>\n" +
                         "      </c:comp-filter>\n" +
                         "    </c:comp-filter>\n" +
                         "  </c:filter>\n" +
                         "</c:calendar-query>";
            return String.format(xml, SDF.format(fromDate), SDF.format(toDate));
        }
    
    
        @Override
        public List<VEvent> fromMultistatus(Multistatus multistatus)
        {
            List<VEvent> events = new ArrayList<>(multistatus.getResponse().size());
            for (Response response : multistatus.getResponse()) {
                // Here response.getPropstat().get(0).getProp().getAny().get(0).getFirstChild().getTextContent() is parsed
                events.addAll(ICalendarSardineReport.getICalendar(response).getEvents());
            }
            return events;
        }
    
    
        @Override
        public Object toJaxb()
        {
            return null;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      相关资源
      最近更新 更多