【问题标题】:Outlook Rest API push notifications: Filter the notifications based on specific custom property set by outlook add-inOutlook Rest API 推送通知:根据 Outlook 加载项设置的特定自定义属性过滤通知
【发布时间】:2017-09-21 08:38:31
【问题描述】:

我按照this question 中提到的相同步骤,根据 Outlook 插件设置的自定义属性过滤推送通知事件。

以下是我在订阅推送通知时使用的资源链接。

https://outlook.office.com/api/v2.0/me/events/?$filter=SingleValueExtendedProperties%2FAny(ep%3A%20ep%2FPropertyId%20eq%20'String%20{00020329-0000-0000-C000-000000000046}%20Name%20cecp-7e248e5e-204e-4e2b-aa0f-788af20fc21c'%20and%20ep%2FValue%20ne%20null)

它过滤具有由加载项设置的自定义属性的日历项目,无论它是什么自定义属性。 通过查看此资源链接,我们可以说我们没有提到自定义属性名称。但是我的加载项为日历项设置了多个自定义属性。我想过滤所有具有特定自定义属性的日历项目。例如,我的加载项根据业务登录将以下任一自定义属性设置为日历。

自定义属性 1:

var item = Office.context.mailbox.item;
item.loadCustomPropertiesAsync((result) => {
     const props = result.value;
     props.set("my_prop_one", "test_value_one");
     props.saveAsync((saveResult) => console.log("Successfull"));
 });

自定义属性 2:

var item = Office.context.mailbox.item;
 item.loadCustomPropertiesAsync((result) => {
      const props = result.value;
      props.set("my_prop_two", "test_value_tw");
      props.saveAsync((saveResult) => console.log("Successful"));
 });

现在我想过滤所有具有自定义属性 my_prop_one 的日历项目。

编辑 1:

正如@Jason Johnston 在其中一个 cmets 中所建议的,我使用 MFCMapi 交叉验证了属性名称和它的 GUID。属性名称和它的 GUID 值都是正确的。

自定义属性meetingsetby的MFCMapi数据。

然后我从 MFCMapi 收集数据并准备以下 url 来过滤具有自定义属性 meetingsetby 且其值为 webex 的日历项目。

https://outlook.office.com/api/v2.0/Me/Events?$filter=SingleValueExtendedProperties%2FAny(ep%3A%20ep%2FPropertyId%20eq%20'String%20{00020329-0000-0000-C000-000000000046}%20Name%20meetingsetby'%20and%20ep%2FValue%20eq%20'webex')

下面是postman 在我使用上面的 url 进行 get 调用时的响应。

如您所见,即使有一个带有自定义属性 meetingsetby 和值 webex 的日历项,响应也有空列表。

然后我使用 Outlook Rest API 将 SingleValueExtendedProperty 设置为日历项目,如this post 中所述。以下是示例请求数据,

SingleValueExtendedProperty的MFCMapi数据

然后我从 MFCMapi 收集数据并准备以下 url 来过滤在上述步骤中设置了 singleValueExtendedProperty 的日历项目。

https://outlook.office.com/api/v2.0/Me/Events?$filter=SingleValueExtendedProperties%2FAny(ep%3A%20ep%2FPropertyId%20eq%20'String%20{6666AA44-4659-4830-9070-00047EC6AC6E}%20Name%20RestApiSingleValueExtendedProperty'%20and%20ep%2FValue%20eq%20'Set this property using REST API')

下面是postman 在我使用上面的 url 进行 get 调用时的响应。

如您所见,我可以使用singleValueExtendedProperty 成功过滤日历项目。但我的要求是过滤具有我的 Outlook Web 插件设置的特定自定义属性的日历项目。

欢迎任何建议/答案。

【问题讨论】:

    标签: microsoft-graph-api outlook-restapi


    【解决方案1】:

    由加载项设置的自定义属性(使用CustomProperties 接口)等同于普通的 MAPI 命名属性。本质上,加载项 API 所做的是获取所有“自定义属性”,将它们序列化为 JSON 有效负载,然后将其保存在单个 MAPI 命名属性中,该属性将具有名称cecp-{some guid},属性集 GUID @ 987654324@。名称的 {some-guid} 部分等于加载项的 Id。这都是在MS-OXCEXT section 2.2.5 中指定的。

    所以这里的最终结果是你不能在CustomProperties 接口中设置的值上使用$filter,因为没有具有该名称和值的SingleValueExtendedProperty。相反,有一个名为cecp-{some guid}SingleValueExtendedProperty,其字符串值是您通过CustomProperties 接口设置的所有自定义道具的JSON 序列化。

    那么你怎么能做你想做的事呢?好吧,回到您的原始 URL,您可以通过执行

    来获取所有具有由您的加载项设置的任何属性的消息
    $filter=SingleValueExtendedProperties/Any
      (ep: ep/PropertyId eq 'String {00020329-0000-0000-C000-000000000046} 
      Name cecp-7e248e5e-204e-4e2b-aa0f-788af20fc21c' and ep/Value ne null)
    

    cecp- 之后的 GUID 替换为您的加载项的 GUID ID。

    当然,您只想找到将特定属性 (meetingsetby) 设置为特定值 (webex) 的那些。不幸的是,我们的 API 在过滤 SingleValueExtendedProperties 时不支持子字符串搜索。因此,您需要做的是获取具有由您的加载项设置的任何属性的所有消息,然后执行您自己的过滤逻辑以找到您想要的那些。所以基本上你会把它们加载到内存中,然后自己检查那个属性的值来找到你想要的。

    您可以使用$expand 子句确保属性的值包含在响应中。像这样的:

    ?$filter=SingleValueExtendedProperties/Any
      (ep: ep/PropertyId eq 'String {00020329-0000-0000-C000-000000000046} 
      Name cecp-7e248e5e-204e-4e2b-aa0f-788af20fc21c' and ep/Value ne null)
      &$expand=SingleValueExtendedProperties($filter=PropertyId eq 'String
      {00020329-0000-0000-C000-000000000046} Name cecp-7e248e5e-204e-4e2b-aa0f-788af20fc21c')
    

    【讨论】:

    • 感谢您的回答。我试过上面的过滤器。之后我根本没有收到推送通知。下面是新的过滤器https://outlook.office.com/api/v2.0/Me/Events?$filter=SingleValueExtendedProperties%2FAny(ep%3A%20ep%2FPropertyId%20eq%20'String%20{00020329-0000-0000-C000-000000000046}%20Name%20my_prop_one'%20and%20ep%2FValue%20ne%20null)。当我向上述 url 发出 get 请求时,我收到的是空数组,即使有多个日历项具有 my_prop_one 自定义属性。
    • GUID 可能是错误的。我这周在 Ignite,无法运行测试,但您应该能够使用 MFCMapi 找到该属性并确定 GUID。
    • 我使用 MFCMapi 交叉验证了属性名称和它的 GUID。属性名称和它的 GUID 值都是正确的。
    • @Johnston 我用我的观察更新了这个问题。
    • 好的。我忘记了加载项自定义属性不仅仅是常规自定义属性,所以我正在更新我的答案。
    猜你喜欢
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2017-07-04
    相关资源
    最近更新 更多