在 RingCentral webhook 中有没有办法区分不同的事件过滤器?
In RingCentral webhook is there a way to differentiate different event filters?
例如
如果我都想听
'eventFilters' => array(
"/restapi/v1.0/account/~/extension/~/presence?detailedTelephonyState=true&aggregate=true",
"/restapi/v1.0/account/~/extension/~/message-store/instant?type=SMS"
如果我想过滤和分析这两个事件,是否应该对来自 RingCentral 的每个 post 请求进行切换?
说..
switch($eventid){
case '/restapi/v1.0/account/<accountid>/extension/<extension>/presence?detailedTelephonyState=true&aggregate=true'
//process data
break;
}
但是 webhook posts 有不同的扩展。是否有触发事件的标识符?
我可以想到几种方法来解决您提出的问题...
- 如果您有一个订阅在多个扩展上有多个事件过滤器,如您所述,过滤传入的
webhook.event
URI 并匹配类型的字符串可能是最快的,然后路由到特定的通知事件类型处理程序。
- 您最多可以在您的帐户中创建 20 个推送通知(订阅),每个推送通知可以包含 1000 个以上的事件过滤器。您可以为您希望监控的六 (6) 种唯一通知事件类型中的任何一种创建单独的 webhook。这样做还可以让您 Update Subscriptions 扩展 on-the-fly.
- 如果您只注册了一个包含多个通知事件类型的订阅,您可以使用 [NotificationType.body 架构 (https://developers.ringcentral.com/api-docs/latest/index.html#!#EventTypes.html) 的 duck-typing,方法是检查
webhook.body
具有所需的属性。
PHP 中的数字 3(未经测试的代码)
$instantMessageEventTypeKeys = array('id', 'to', 'from', 'type', 'creationTime', 'lastModifiedTime', 'readStatus', 'priority', 'attachments', 'direction', 'availability', 'subject', 'messageStatus', 'conversationid');
function genericNotificationHandler($eventJson) {
$eventObj = json_decode($eventJson, true);
foreach($instantMessageEventTypeKeys) {
// If the event.body keys match, route to
if(arrayKeys(eventObj=>['body']) === $instantMessageEventType)) {
//Call some instantMessageSpecificEventHandler($eventObj);
}
}
}
JavaScript 中的数字 3(未经测试的代码)
// Instant Message Notification Event Type properties
const instantMessageEventTypeKeys = ['id', 'to', 'from', 'type', 'creationTime', 'lastModifiedTime', 'readStatus', 'priority', 'attachments', 'direction', 'availability', 'subject', 'messageStatus', 'conversationid']
const proxyHandlers = {
get (target, key) {
if ('notificationEventType' === key[0]) {
let targetKeys = target.body.ownKeys.sort().join(',');
if(targetKeys === instantMessageEventTypeKeys.sort().join(',')) return 'Instant Message'
}
}
}
const genericNotificationHandler = (notificationData) => {
// You could create traps in handlers below to simplify further
let pEvent = new Proxy(notificationData, proxyHandlers);
if('Instant Message' === pEvent.notificationEventType) {
// instantMessageSpecificEventHandler(notificationData)
}
}
以 Ben 的第一种方法为基础:
If you have a single subscription with multiple eventFilters on multiple extensions, as you've stated, filtering the incoming webhook.event
URI and match the string for type is probably fastest, then route to a specific Notification Event Type handler.
webhook 有效负载如下所示。 event
属性 将指示正在触发的事件类型,您的应用程序可以使用它来启动差异化处理。我在下面使用了空的 body
,但在实际的 post 中,它将填充特定于该事件类型的正文。
{
"uuid":"12345678901234567890",
"event":"/restapi/v1.0/glip/posts",
"timestamp":"2018-05-01T16:39:41.693Z",
"subscriptionId":"11112222-3333-4444-5555-666677778888",
"ownerId":"11111111",
"body":{}
}
在 Go community SDK go-ringcentral
中,我开始构建一个 returns 事件类型的函数,给定事件字符串:
ParseEventTypeForFilter(eventFilter string) (EventType, error) {
这是事件类型列表:
const(
AccountPresenceEvent EventType = iota
ContactDirectoryEvent
DetailedExtensionPresenceEvent
DetailedExtensionPresenceWithSIPEvent
ExtensionFavoritesEvent
ExtensionFavoritesPresenceEvent
ExtensionGrantListEvent
ExtensionListEvent
ExtensionInfoEvent
ExtensionPresenceEvent
ExtensionPresenceLineEvent
GlipGroupsEvent
GlipPostEvent
GlipUnreadMessageCountEvent
InboundMessageEvent
IncomingCallEvent
InstantMessageEvent
MessageEvent
MissedCallEvent
RCVideoNotificationsEvent
SubscriptionRenewalEvent
)
代码:https://github.com/grokify/go-ringcentral/blob/master/clientutil/event_filter.go
例如
如果我都想听
'eventFilters' => array(
"/restapi/v1.0/account/~/extension/~/presence?detailedTelephonyState=true&aggregate=true",
"/restapi/v1.0/account/~/extension/~/message-store/instant?type=SMS"
如果我想过滤和分析这两个事件,是否应该对来自 RingCentral 的每个 post 请求进行切换?
说..
switch($eventid){
case '/restapi/v1.0/account/<accountid>/extension/<extension>/presence?detailedTelephonyState=true&aggregate=true'
//process data
break;
}
但是 webhook posts 有不同的扩展。是否有触发事件的标识符?
我可以想到几种方法来解决您提出的问题...
- 如果您有一个订阅在多个扩展上有多个事件过滤器,如您所述,过滤传入的
webhook.event
URI 并匹配类型的字符串可能是最快的,然后路由到特定的通知事件类型处理程序。 - 您最多可以在您的帐户中创建 20 个推送通知(订阅),每个推送通知可以包含 1000 个以上的事件过滤器。您可以为您希望监控的六 (6) 种唯一通知事件类型中的任何一种创建单独的 webhook。这样做还可以让您 Update Subscriptions 扩展 on-the-fly.
- 如果您只注册了一个包含多个通知事件类型的订阅,您可以使用 [NotificationType.body 架构 (https://developers.ringcentral.com/api-docs/latest/index.html#!#EventTypes.html) 的 duck-typing,方法是检查
webhook.body
具有所需的属性。
PHP 中的数字 3(未经测试的代码)
$instantMessageEventTypeKeys = array('id', 'to', 'from', 'type', 'creationTime', 'lastModifiedTime', 'readStatus', 'priority', 'attachments', 'direction', 'availability', 'subject', 'messageStatus', 'conversationid');
function genericNotificationHandler($eventJson) {
$eventObj = json_decode($eventJson, true);
foreach($instantMessageEventTypeKeys) {
// If the event.body keys match, route to
if(arrayKeys(eventObj=>['body']) === $instantMessageEventType)) {
//Call some instantMessageSpecificEventHandler($eventObj);
}
}
}
JavaScript 中的数字 3(未经测试的代码)
// Instant Message Notification Event Type properties
const instantMessageEventTypeKeys = ['id', 'to', 'from', 'type', 'creationTime', 'lastModifiedTime', 'readStatus', 'priority', 'attachments', 'direction', 'availability', 'subject', 'messageStatus', 'conversationid']
const proxyHandlers = {
get (target, key) {
if ('notificationEventType' === key[0]) {
let targetKeys = target.body.ownKeys.sort().join(',');
if(targetKeys === instantMessageEventTypeKeys.sort().join(',')) return 'Instant Message'
}
}
}
const genericNotificationHandler = (notificationData) => {
// You could create traps in handlers below to simplify further
let pEvent = new Proxy(notificationData, proxyHandlers);
if('Instant Message' === pEvent.notificationEventType) {
// instantMessageSpecificEventHandler(notificationData)
}
}
以 Ben 的第一种方法为基础:
If you have a single subscription with multiple eventFilters on multiple extensions, as you've stated, filtering the incoming
webhook.event
URI and match the string for type is probably fastest, then route to a specific Notification Event Type handler.
webhook 有效负载如下所示。 event
属性 将指示正在触发的事件类型,您的应用程序可以使用它来启动差异化处理。我在下面使用了空的 body
,但在实际的 post 中,它将填充特定于该事件类型的正文。
{
"uuid":"12345678901234567890",
"event":"/restapi/v1.0/glip/posts",
"timestamp":"2018-05-01T16:39:41.693Z",
"subscriptionId":"11112222-3333-4444-5555-666677778888",
"ownerId":"11111111",
"body":{}
}
在 Go community SDK go-ringcentral
中,我开始构建一个 returns 事件类型的函数,给定事件字符串:
ParseEventTypeForFilter(eventFilter string) (EventType, error) {
这是事件类型列表:
const(
AccountPresenceEvent EventType = iota
ContactDirectoryEvent
DetailedExtensionPresenceEvent
DetailedExtensionPresenceWithSIPEvent
ExtensionFavoritesEvent
ExtensionFavoritesPresenceEvent
ExtensionGrantListEvent
ExtensionListEvent
ExtensionInfoEvent
ExtensionPresenceEvent
ExtensionPresenceLineEvent
GlipGroupsEvent
GlipPostEvent
GlipUnreadMessageCountEvent
InboundMessageEvent
IncomingCallEvent
InstantMessageEvent
MessageEvent
MissedCallEvent
RCVideoNotificationsEvent
SubscriptionRenewalEvent
)
代码:https://github.com/grokify/go-ringcentral/blob/master/clientutil/event_filter.go