使用Microsoft Graph创建Office 365日历事件时会议室响应状态查询问题
关于Microsoft Graph预订会议室后获取接受状态的解决方案
嘿,我之前做Office 365会议室预订功能的时候也碰到过这个问题,来给你详细说说怎么处理~
首先得明确一点:当你调用user_post_events接口,把会议室作为resource类型的参会者添加到事件中时,这个操作本质是向会议室邮箱发送了一个预订请求,而不是直接完成预订。所以接口返回的即时结果里不会包含会议室是否接受的状态——因为这个状态需要会议室邮箱的规则(自动接受/审批流程)处理后才会生成。
那怎么获取会议室的最终响应呢?有两个常用的方法:
方法一:订阅事件变更通知
你可以通过Microsoft Graph的订阅功能,监听目标事件的状态变化。当会议室邮箱处理了你的预订请求(不管是自动接受还是人工审批通过/拒绝),事件的参会者列表里对应会议室的responseStatus字段会更新。
订阅的大致思路是:
- 调用
POST /subscriptions创建订阅,指定要监听的资源路径(比如/me/events/{event-id}),以及你的通知回调地址 - 当会议室的响应状态变化时,Graph会向你的回调地址发送通知,你再根据通知里的事件ID去拉取最新的事件详情,就能看到会议室的
responseStatus.status(可能是accepted、declined、tentativelyAccepted)
这种方法适合实时性要求高的场景,不用一直轮询。
方法二:主动轮询事件详情
如果你的场景对实时性要求没那么高,或者不想处理回调逻辑,也可以在创建事件后,定期调用查询接口获取事件的最新状态:
- 调用
GET /me/events/{event-id}(或者GET /users/{user-id}/events/{event-id},如果是操作其他用户的事件) - 在返回的
attendees数组里找到类型为resource的那条记录,查看responseStatus.status字段的值:none:会议室还没处理请求accepted:预订成功declined:预订被拒绝(可能是时间冲突)tentativelyAccepted:暂定接受(部分会议室可能有这个状态)
另外给你提个小建议:你提供的请求示例里缺少start字段和subject字段,这两个都是创建事件的必填项,补全后接口才能正常调用,比如完整的请求体应该是这样的:
{ "subject": "部门周会预订", "start": { "dateTime": "2018-05-11T11:10:10", "timeZone": "Europe/London" }, "end": { "dateTime": "2018-05-11T12:10:10", "timeZone": "Europe/London" }, "attendees": [ { "type": "resource", "emailAddress": { "address": "berlin@yourtenant.onmicrosoft.com" } } ] }
最后补充一句:如果你的企业租户设置了会议室自动接受请求(大部分公司都是这么配置的),那通常几秒内状态就会更新,轮询个两三次基本就能拿到结果;如果是需要人工审批的特殊会议室,那可能就得等管理员处理后才能拿到状态啦。
内容的提问来源于stack exchange,提问作者julio
相关产品推荐
相关产品推荐

