能够通过API

时间:2015-12-08 18:51:35

标签: office365 office365api

以下是我认为是Calendar REST API中的错误 - 但我希望找到解决方法。

简而言之,我可以通过API将日历事件发布到只读日历而不会出错。奇怪的是,365 UI知道日历是只读的,并且不允许通过UI进行编辑。

这会导致我们的同步出现问题,因为当原始日历再次发布时,所有新事件都会被删除。我的问题是我怎么能确定我写的日历具有正确的写权限(如UI所做的那样),其次,这是我可以通过API而不是通过UI编写的错误?

重现的步骤:

  1. 获取一个公开的,只读的日历地址。例如this
  2. 在365中,右键点击“我的日历”'和'打开日历' enter image description here
  3. 在互联网日历中的(1)地址中粘贴'领域。日历应显示在“我的日历”下。 请注意,您无法通过用户界面
  4. 为此日历创建活动
  5. 使用GET https://outlook.office.com/api/v1.0/me/calendars获取新添加的日历ID
  6. 使用POST https://outlook.office.com/api/v1.0/me/calendars/[CALENDAR_ID]/events为新日历创建活动。
  7. 预期行为 与UI一样,API不允许您写入此日历。

    实际行为 成功创作,201创建归来。惊喜!一段时间后(4-6小时),新创建的事件将被删除。如果您要同步此日历,则会导致问题,因为删除将传播到与该日历同步的客户端。

    enter image description here

1 个答案:

答案 0 :(得分:3)

感谢您报告此事。我调查了这一点,不幸的是,目前不是一个很好的答案。我们正在努力改进以使API与Outlook和OWA更加一致。不幸的是,我没有时间表可以分享。

基本上,当您订阅互联网日历时,会在邮箱中创建辅助日历。它并非真正只读,但Outlook和OWA知道它的目的是与互联网日历同步并且不允许您在那里创建项目。这个逻辑完全在客户端上,而不是在服务器上,这就是它今天的行为方式。

下次启动与网络摄像头网址的同步过程时,该事件会被删除,因为它不会从网络链接中拉下来的ICS中存在。

作为一种解决方法,如果您愿意进入/beta端点,则可以检索日历上的PidTagExtendedFolderFlags属性。这是一个二进制属性,因此您需要对其进行一些解析才能获得数据。格式记录在MS-OXOCFG中。您需要解析sub-property Id等于0x01,然后将Data测试为0x40位的位掩码。如果已设置,则应将该文件夹视为只读。

要获取此属性,您需要展开{​​{1}}实体上的SingleValueExtendedProperties,如下所示:

Calendar

这将返回如下内容:

GET https://outlook.office.com/api/beta/me/calendars?
$expand=SingleValueExtendedProperties($filter=PropertyId eq 'Binary 0x36da')

这些属性的值是base64编码的二进制blob。如果你解码它们,你会得到类似的东西:

  • 日历:010400001000
  • 对于互联网日历:010440251002

按照格式解释,我们有:

{
  "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"
        }
      ]
    }
  ]
}

0x40位在Id: 0x01 Cb: 0x04 Data: 0x02102540 字段中设置,因此一个是只读的。