下面是我认为是Calendar REST API中的一个bug --但我希望找到一个解决办法。
简而言之,我可以通过API将日历事件发布到只读日历中,而不会出错。奇怪的是,365个UI知道日历是只读的,并且不允许通过UI进行编辑。
这会导致同步出现问题,就像原始日历再次发布时一样,所有新事件都会被删除。我的问题是,我如何确定我要写的日历具有适当的写权限(就像UI一样),其次,我可以通过API而不是通过UI编写这个错误吗?
复制步骤:

GET https://outlook.office.com/api/v1.0/me/calendars获取新添加的日历IDPOST https://outlook.office.com/api/v1.0/me/calendars/[CALENDAR_ID]/events为新日历创建事件。预期的行为就像UI一样,API不允许您写入此日历。
实际行为成功创建,201创建返回。惊喜吧!一段时间后(4-6小时),新创建的事件将被删除。如果同步此日历,则会导致问题,因为删除将传播到与该日历同步的任何客户端。

发布于 2015-12-10 18:41:14
谢谢你的报道。我研究过这个问题,不幸的是,目前还没有一个很好的答案。这是我们正在改进的东西,以使API更符合Outlook和OWA。不幸的是,我没有任何时间表可以分享。
基本上,当您订阅internet日历时,将在邮箱中创建一个辅助日历。它并不是真正的只读,但Outlook和OWA知道,它的目的是与互联网日历同步,不会让您在那里创建项目。这个逻辑都在客户端上,而不是服务器上,这就是为什么它现在的行为方式。
下次当同步进程与webcal URL开始同步时,事件就会被删除,因为它不存在于从webcal链接中提取的ICS中。
作为一种解决办法,如果您愿意访问/beta端点,您可以在日历上检索PidTagExtendedFolderFlags属性。这是一个二进制属性,因此您需要对其进行一些解析才能获取数据。这种格式是用OXOCFG记录的。您需要为子属性解析Id = 0x01,然后将Data测试为0x40位的位掩码。如果设置了该文件夹,则应将其视为只读文件夹。
要获得此属性,需要在SingleValueExtendedProperties实体上展开Calendar,如下所示:
GET https://outlook.office.com/api/beta/me/calendars?
$expand=SingleValueExtendedProperties($filter=PropertyId eq 'Binary 0x36da')这将返回如下内容:
{
"value": [
{
"Id": "AAMkAGRm...AAA=",
"Name": "Calendar",
"Color": "Auto",
"ChangeKey": "nxdFEDVaMUqvOVUO3592PQAAFmsEKg==",
"SingleValueExtendedProperties": [
{
"PropertyId": "Binary 0x36da",
"Value": "AQQAABAA"
}
]
},
{
"Id": "AAMkAGRm...AAA=",
"Name": "Internet Calendar",
"Color": "Auto",
"ChangeKey": "nxdFEDVaMUqvOVUO3592PQAAFmsELQ==",
"SingleValueExtendedProperties": [
{
"PropertyId": "Binary 0x36da",
"Value": "AQRAJRAC"
}
]
}
]
}这些属性的值是base64 64编码的二进制blobs。如果你对它们进行解码,你会得到这样的信息:
根据这些格式进行解释,我们有:
Id: 0x01
Cb: 0x04
Data: 0x021025400x40位是在Data字段中设置的,因此其中一个是只读的。
https://stackoverflow.com/questions/34163719
复制相似问题