CALDAV 在 ICLOUD 中编辑/删除多个事件
Posted
技术标签:
【中文标题】CALDAV 在 ICLOUD 中编辑/删除多个事件【英文标题】:CALDAV Edit/Delete multiple events in ICLOUD 【发布时间】:2018-07-06 10:23:22 【问题描述】:我已经实现了 caldav api 来添加、更新、删除 icloud 日历中的事件,并且一切都按预期工作。在一次 api 调用中添加、更新、删除多个事件时,添加工作没有太多问题。但不知道如何在一次 api 调用中编辑和删除多个事件。
下面的代码将告诉我如何删除一个事件
public void DeleteEvent(CalendarToken authToken, string eventId, Action<APIResponse> callback)
var appleToken = GetAppleAuthToken(authToken);
string url = @"https://" + appleToken.AppleCalendarDomainUrl + "/" + appleToken.AppleUserID + "/calendars/home/" + eventId + "_event.ics";
string response = SendRequest(appleToken, url, string.Empty, "DELETE", "application/xml; charset=utf-8", "0");
private string SendRequest(AppleCalendarToken appleToken, string destinationUrl, string requestData, string methodType, string contentType, string depthValue)
try
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(destinationUrl);
byte[] bytes;
bytes = System.Text.Encoding.ASCII.GetBytes(requestData);
request.Credentials = GetCredentials(appleToken, destinationUrl);
request.PreAuthenticate = true;
request.ContentType = contentType; //"application/xml; encoding='utf-8'";
request.ContentLength = bytes.Length;
request.Method = methodType;
request.Headers.Add("Depth", depthValue);
request.Accept = "*/*";
request.UserAgent = "cURL based CalDAV client";
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
HttpWebResponse response;
response = (HttpWebResponse)request.GetResponse();
if ((int)response.StatusCode == 207 || (int)response.StatusCode == 201)
Stream responseStream = response.GetResponseStream();
return new StreamReader(responseStream).ReadToEnd();
catch
throw;
return string.Empty;
下面的截图将显示我如何在一个 api 调用中添加多个事件 我希望在一次 api 调用中编辑/删除多个事件。 任何帮助,将不胜感激。提前致谢。
【问题讨论】:
【参考方案1】:不幸的是,这个问题的答案很简短:WebDAV/CalDAV 中没有批量删除功能。您需要一个一个地删除它们。
(您可以使用一次 DELETE 删除整个日历集合,但这可能不是您想要的。)
更新/澄清:标准CalDAV/WebDAV 不支持任何批量更改操作。您可以使用多个连接、HTTP/2 多路复用或 HTTP/1.1 管道同时向服务器发送多个 HTTP 请求。如果服务器很智能,它可以合并这些变化。至少使用 HTTP/2,这可以说消除了对 BATCH
操作的需要。
执行批量更改有两种非标准方式:
a) 包含多个事件的单个 vCalendar 实体的 POST 到集合 URL b) Apple Calendar Server 和 iCloud 支持的calendarserver-bulk-change
draft,也许还有其他支持
“a)”中集合的 POST(有时甚至是 PUT)允许您添加和有时更新(通过使用匹配的 UID)多个事件。许多服务器实际上以一种或另一种方式支持这一点。我建议不要使用它,因为语义非常不清楚/不标准化。例如,如果一个 sub-PUT 失败等会发生什么。
Bulk-Change 草案描述了用于批量更改的 POST,但 (AFAIK) 并未得到广泛实施。它也从未成为 RFC(而且因为使用 HTTP/2 有点多余,我不希望发生这种情况)。
【讨论】:
我在一次 api 调用中成功添加了多个事件。但不确定如何进行别克更新。请有任何建议..以上是关于CALDAV 在 ICLOUD 中编辑/删除多个事件的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Caldav 客户端为 iCloud 日历删除重复的事件条目