CALDAV Edit/Delete ICLOUD 中的多个事件

CALDAV Edit/Delete multiple events in ICLOUD

我已经实施了 caldav api 来添加、更新、删除 icloud 日历中的事件,一切都按预期工作。当谈到在一个 api 调用中添加、更新、删除多个事件时,添加工作没有太多 issues.But 不确定我如何在一个 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 通话中寻找 edit/delete 多个事件。 任何帮助,将不胜感激。提前致谢。

不幸的是,该问题的答案非常简短:WebDAV/CalDAV 中没有批量删除功能。您需要一个一个地删除它们。

(您可以通过一次 DELETE 删除整个日历集合,但这可能不是您想要的。)

Update/Clarification: 标准 CalDAV/WebDAV 不支持任何批量更改操作。您可以使用多个连接、HTTP/2 多路复用或 HTTP/1.1 管道同时向服务器发送多个 HTTP 请求。如果服务器很聪明,它可以合并这些变化。至少 w/ HTTP/2 这可以说消除了对 BATCH 操作的需要。

有两种非标准的方式来执行批量更改:

  • a) 包含多个事件的单个 vCalendar 实体的 POST 集合 URL
  • b) Apple Calendar Server 和 iCloud 支持的 calendarserver-bulk-change draft,也许其他

“a)”中集合的 POST(有时甚至是 PUT)允许您添加并有时更新(通过使用匹配的 UID)多个事件。许多服务器实际上以一种或另一种方式支持这一点。我建议不要使用它,因为语义非常 unclear/not-standardized。例如,如果一个子PUT失败会发生什么等

Bulk-Change 草案描述了 POST 的批量更改,但(据我所知)并未广泛实施。它也没有成为 RFC(因为 w/ HTTP/2 它有点多余,我不希望发生这种情况)。