google-calendar-api - 谷歌日历 CalDAV 时间范围不起作用
问题描述
我试图在一个时间范围内获取所有事件。这是我的 CalDAV 请求正文:
<?xml version="1.0" encoding="UTF-8"?>
<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop xmlns:D="DAV:">
<C:calendar-data />
</D:prop>
<C:filter>
<C:comp-filter name="VEVENT">
<C:time-range end="20200920T134847" start="20200919T134847" />
</C:comp-filter>
</C:filter>
</C:calendar-query>
可以看出,我使用了时间范围分量过滤器。不幸的是,这也会返回时间范围之外的事件:
...
DTSTART;TZID=Europe/Amsterdam:20200522T111028
DTEND;TZID=Europe/Amsterdam:20200522T121028
...
谁能看到出了什么问题?
我看到了这个和这个例子,它将VEVENT
comp-filter 放在VCALENDAR
comp-filter 中,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">
<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="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:prop>
</c:prop>
</c:prop>
</c:prop>
</c:prop>
</c:prop>
</c:prop>
</c:prop>
</c:prop>
</c:comp>
<c:comp name="VTIMEZONE" />
</c:prop>
</c:comp>
</c:calendar-data>
</d:getetag>
</d:prop>
<c:filter>
<c:comp-filter name="VCALENDAR">
<c:comp-filter name="VEVENT">
<c:time-range start="20060104T000000Z" end="20060105T000000Z" />
</c:comp-filter>
</c:comp-filter>
</c:filter>
</c:calendar-query>
所以我尝试了以下方法:
<?xml version="1.0" encoding="UTF-8"?>
<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop xmlns:D="DAV:">
<C:calendar-data />
</D:prop>
<C:filter>
<C:comp-filter name="VCALENDAR">
<C:comp-filter name="VEVENT">
<C:time-range end="20200920T135938" start="20200919T135938" />
</C:comp-filter>
</C:comp-filter>
</C:filter>
</C:calendar-query>
但随后谷歌给出了以下错误信息:
<?xml version="1.0" encoding="UTF-8"?>
<errors xmlns="http://schemas.google.com/g/2005">
<error>
<domain>GData</domain>
<code>badRequest</code>
<internalReason>Bad Request</internalReason>
</error>
</errors>
我似乎无法弄清楚出了什么问题。
//更新:
我尝试了 icalendar.org 中的示例,这似乎有效。唯一的问题是我无法使用 caldav4j 复制该请求正文。
我还尝试从 caldav4j 复制确切的示例:
<?xml version="1.0" encoding="UTF-8"?>
<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop xmlns:D="DAV:">
<D:getetag />
<C:calendar-data>
<C:comp name="VCALENDAR">
<C:comp name="VEVENT">
<C:prop name="SUMMARY" />
<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 name="VTIMEZONE" />
<C:prop name="VERSION" />
</C:comp>
</C:calendar-data>
</D:prop>
<C:filter>
<C:comp-filter name="VCALENDAR">
<C:comp-filter name="VEVENT">
<C:time-range end="20200920T161921" start="20200919T161921" />
</C:comp-filter>
</C:comp-filter>
</C:filter>
</C:calendar-query>
不幸的是,它给出了另一个 badRequest 响应。
解决方案
最后,我最终切换到另一个 CalDAV 服务器 (Radicale) 进行服务器端日志记录。事实证明,时间符号应该以“Z”结尾。
推荐阅读
- java - Android - Appium 向下滑动不起作用
- email - 如何将电子邮件地址放入要提交到谷歌表单的响应项中?
- python - 为什么我无法播放我以编程方式下载的 MIDI 文件,但我手动下载它们时可以播放它们?
- sql - 如何使用 pl/sql 制作 ANSI 编码的文本文件?
- flask - Flask 单选按钮,可为数据库表中的每个用户选择
- c# - C# 将包含 \" 的字符串替换为 "
- joomla - Joomla 模板 - 在主页上
- java - Array.sort 不对所有元素进行排序
- c - 使用文件和结构的 C 程序
- sql - 回答 sql ex ru 编号 57