CALDAV Редактировать / Удалить несколько событий в ICLOUD - PullRequest
0 голосов
/ 06 июля 2018

Я реализовал 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. enter image description here Я ищу изменить / удалить более одного события в одном вызове API. Любая помощь будет оценена. Заранее спасибо.

1 Ответ

0 голосов
/ 08 июля 2018

К сожалению, ответ на этот вопрос очень короткий: в WebDAV / CalDAV нет возможности массового удаления. Вам нужно удалить их один за другим.

(Вы можете удалить целую коллекцию календаря одним DELETE, но это, вероятно, не то, что вы хотите.)

Обновление / уточнение: Стандарт CalDAV / WebDAV не поддерживает какие-либо операции массовых изменений. Вы можете отправлять несколько HTTP-запросов на сервер одновременно, используя несколько соединений, мультиплексирование HTTP / 2 или конвейеризацию HTTP / 1.1. И если сервер умный, он может объединить такие изменения. По крайней мере с HTTP / 2 это, вероятно, устраняет необходимость операции BATCH.

Существует два нестандартных способа выполнения массовых изменений:

  • a) POST одного объекта vCalendar, содержащего несколько событий для URL коллекции
  • b) calendarserver-bulk-change черновик , который поддерживается Apple Calendar Server и iCloud, возможно, другие

POST (иногда даже PUT) к коллекции в «a)» позволяет добавлять и иногда обновлять (используя соответствующий UID) несколько событий. Многие серверы на самом деле поддерживают это так или иначе. Я рекомендую не использовать это, потому что семантика очень неясна / не стандартизирована. Например, что произойдет, если произойдет сбой одного вспомогательного PUT и т. Д.

Черновик Bulk-Change описывает POST для массовых изменений, но (AFAIK) широко не применяется. Он также никогда не становился RFC (а поскольку w / HTTP / 2 является своего рода излишним, я не ожидаю, что это произойдет).

...