В API календаря Microsoft Graph я могу получить все события с URL-адресом запроса:
/me/calendarView/delta?startDateTime = {start_datetime}&endDateTime = {end_datetime}
Но я должен указать дату начала и окончания. Есть ли способ просто получить все события без указания дат?
Простое исключение дат из запроса дает мне ошибку, что в нем отсутствуют эти параметры.
Конечная точка /calendarView
предназначена для предоставления вам визуализированного представления календаря для заданного диапазона дат. Без диапазона дат API пришлось бы отображать каждое событие в календаре, возможно, на десятилетия назад. Вычислительные затраты на это могут быть чрезмерно высокими, не говоря уже о негативном влиянии на производительность в масштабе.
Если вам нужны только необработанные базовые объекты event
, вы можете использовать конечную точку /events
. Это даст вам постраничные результаты, содержащие каждое событие в этом календаре. Вам нужно будет выполнить некоторую постобработку, чтобы отобразить отдельные экземпляры для повторяющихся событий на основе главного события (т. е. событий с "eventType": "seriesMaster"
).
В общем, я бы рекомендовал использовать /calendarView
, так как он обрабатывает для вас экземпляры серии. Вы можете эффективно имитировать получение «всего», передав ему достаточно большое окно, хотя и с ударом по производительности.
Чтобы проиллюстрировать это, вызов следующего URI в Обозреватель графов возвращает полное десятилетие (2009-2019) событий:
https://graph.microsoft.com/v1.0/me/calendarview?startdatetime=2009-01-01&enddatetime=2019-12-31
Стоит отметить, что для возврата результата потребовалось 6 436 миллисекунд, а данные содержат лишь небольшое количество событий. Когда я выполнил этот же запрос для календаря мой, это заняло 13 883 миллисекунды. Так что чисто с точки зрения производительности я бы не рекомендовал регулярно выполнять запросы более 12 месяцев за раз (т.е. startdatetime=2018-01-01&enddatetime=2018-12-31
заняло 2795 мс).
Если вы синхронизируете, вы должны использовать дельты вместо того, чтобы каждый раз извлекать все целиком. Первый проход дает вам все, но последующие вызовы вернут только изменения в календарь. Это сэкономит вам много обработки.
Да, это то, что я имел в виду, поэтому меня не очень заботило время первой синхронизации. Однако если я использую дельты, будут ли даты начала и окончания по-прежнему применяться к дельтам? Даже если я не передаю ему параметры?
Это будет поддерживать окно даты, да. Вот почему я предложил использовать полный год. Когда я делал это в прошлом, я поддерживал два токена. Один на текущий год, другой на последующий год. 31 декабря я делаю «последующий» токен «текущим» токеном и получаю новую дельту на следующий год.
Спасибо за подробную информацию. Дело в том, что это просто для синхронизации, так что пара секунд не проблема. Но почти 14 секунд действительно слишком много. Я пойду с календарем с более низким диапазоном.