首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >能够通过API将事件写入只读日历。

能够通过API将事件写入只读日历。
EN

Stack Overflow用户
提问于 2015-12-08 18:51:35
回答 1查看 1K关注 0票数 3

下面是我认为是Calendar REST API中的一个bug --但我希望找到一个解决办法。

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

这会导致同步出现问题,就像原始日历再次发布时一样,所有新事件都会被删除。我的问题是,我如何确定我要写的日历具有适当的写权限(就像UI一样),其次,我可以通过API而不是通过UI编写这个错误吗?

复制步骤:

  1. 找个公共的,只读的日历地址。Eg
  2. 在365中,右击“我的日历”和“打开日历”

  1. 粘贴在地址(1)在‘互联网日历’字段。日历应该出现在“我的日历”下面。注意:您无法通过UI为此日历创建事件。
  2. 使用GET https://outlook.office.com/api/v1.0/me/calendars获取新添加的日历ID
  3. 使用POST https://outlook.office.com/api/v1.0/me/calendars/[CALENDAR_ID]/events为新日历创建事件。

预期的行为就像UI一样,API不允许您写入此日历。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,如下所示:

代码语言:javascript
复制
GET https://outlook.office.com/api/beta/me/calendars?
$expand=SingleValueExtendedProperties($filter=PropertyId eq 'Binary 0x36da')

这将返回如下内容:

代码语言:javascript
复制
{
  "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。如果你对它们进行解码,你会得到这样的信息:

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

根据这些格式进行解释,我们有:

代码语言:javascript
复制
Id: 0x01
Cb: 0x04
Data: 0x02102540

0x40位是在Data字段中设置的,因此其中一个是只读的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34163719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档