如何更简便地检索日历事件的全部扩展属性?
如何简化检索日历事件全部扩展属性的Graph API请求?
问题背景
需要检索单个日历事件的4个自定义扩展属性(字符串、日期时间、两个整数),当前使用的Graph API请求URL如下:
https://graph.microsoft.com/v1.0/users/{{UserID}}/calendar/events/{{TTSyncedEventID}}?$expand=singleValueExtendedProperties( $filter=id eq 'Integer {00020329-0000-0000-C000-000000000046} Name TTID' or id eq 'String {00020329-0000-0000-C000-000000000046} Name TTSyncID' or id eq 'Integer {00020329-0000-0000-C000-000000000046} Name TTSyncVer' or id eq 'SystemTime {00020329-0000-0000-C000-000000000046} Name TTSyncTime')
该URL过于冗长,希望找到更简便的方式检索事件的全部扩展属性。根据《Get singleValueLegacyExtendedProperty》文档说明:
使用$filter和eq运算符对id属性进行筛选,以指定扩展属性。这是获取代表扩展属性的singleValueLegacyExtendedProperty对象的唯一方式。
想确认是否存在通过$filter实现的简化方案。
解决方案
遗憾的是,目前Microsoft Graph API并没有直接获取单个事件全部扩展属性的内置方法——文档的描述是准确的,必须通过$filter指定每个扩展属性的ID来筛选返回结果。不过可以通过以下两种方式优化当前请求:
1. 利用contains缩短重复筛选逻辑
注意到所有目标扩展属性都使用同一个GUID {00020329-0000-0000-C000-000000000046},可以通过contains运算符合并重复部分,简化URL:
https://graph.microsoft.com/v1.0/users/{{UserID}}/calendar/events/{{TTSyncedEventID}}?$expand=singleValueExtendedProperties($filter=contains(id, '{00020329-0000-0000-C000-000000000046}') and (contains(id, 'Name TTID') or contains(id, 'Name TTSyncID') or contains(id, 'Name TTSyncVer') or contains(id, 'Name TTSyncTime')))
这种方式减少了重复的GUID字符串,让URL更紧凑,但需确保不会误匹配其他使用同一GUID的无关属性。
2. 使用批量请求拆分查询
如果希望避免单个URL过于冗长,可以使用Graph API的批量请求功能,将多个属性查询合并为一次HTTP调用:
POST https://graph.microsoft.com/v1.0/$batch Content-Type: application/json { "requests": [ { "id": "1", "method": "GET", "url": "/users/{{UserID}}/calendar/events/{{TTSyncedEventID}}?$expand=singleValueExtendedProperties($filter=id eq 'Integer {00020329-0000-0000-C000-000000000046} Name TTID')" }, { "id": "2", "method": "GET", "url": "/users/{{UserID}}/calendar/events/{{TTSyncedEventID}}?$expand=singleValueExtendedProperties($filter=id eq 'String {00020329-0000-0000-C000-000000000046} Name TTSyncID')" }, { "id": "3", "method": "GET", "url": "/users/{{UserID}}/calendar/events/{{TTSyncedEventID}}?$expand=singleValueExtendedProperties($filter=id eq 'Integer {00020329-0000-0000-C000-000000000046} Name TTSyncVer')" }, { "id": "4", "method": "GET", "url": "/users/{{UserID}}/calendar/events/{{TTSyncedEventID}}?$expand=singleValueExtendedProperties($filter=id eq 'SystemTime {00020329-0000-0000-C000-000000000046} Name TTSyncTime')" } ] }
批量请求将多个查询合并为一次调用,虽然请求体更长,但避免了单个URL冗长的问题,同时便于维护拆分不同属性的查询逻辑。
关键说明
- 目前Graph API不支持
$expand=singleValueExtendedProperties不带$filter的写法,无法直接获取事件的全部扩展属性,必须明确指定要筛选的属性ID。 - 使用
contains筛选时需谨慎,确保不会匹配到其他同名或同GUID的无关扩展属性,建议仅在属性命名具有唯一性的场景下使用。
内容的提问来源于stack exchange,提问作者Jan Doggen
相关产品推荐
相关产品推荐

