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 日历删除重复的事件条目

CALDAV 在 icloud 中添加带有注释的事件

CalDAV 请求 gGt iCloud 日历事件

ICloud Caldav连接获取日历

从 iCloud 获取 CalDAV 事件返回“403 Forbidden”

iCloud Caldav 连接以获取日历