Lorawan-stack: Webhook URL 中的自定义变量支持

创建于 2019-07-16  ·  9评论  ·  资料来源: TheThingsNetwork/lorawan-stack

概括

目前 webhook 的最终 URL 是静态的,它不支持自定义变量,例如JoinEUIDevIDDevEUIDevAddr 。 结果应该是 Webhook 的基本 URL(例如http://example.com/app1/wh1 )可以变为http://example.com/app1/wh1/{{.DevEUI}} ,并允许 Webhook 端点更好地路由上行链路。 这也应该适用于特定于消息的 URL(上行链路消息、下行链路排队等)

我们为什么需要这个?

这将允许更好地路由 Webhook,也使我们能够仅将某些集成(例如 OpenSensors)编写为 WebHook。

什么已经存在? 你现在看到了什么?

静态 URL 支持 - BaseURL根据上行链路类型与主题连接,但没有自定义路由字段。

缺什么? 你要看什么?

自定义路由字段{{.AppEUI}}{{.JoinEUI}}{{.DevID}}{{.DevEUI}}{{.DevAddr}}

环境

不适用。

你建议如何实施?

newRequest.中发生 base URL + config URL join 后替换 URL 中的自定义变量

你可以自己做这个并提交一个拉请求吗?

是的。

application server in progress

所有9条评论

根据字段的外观,我怀疑您打算使用text/template来实现它。 如果确实如此,那么请注意,在每个上行链路上解析执行模板(尤其是如果它不仅是基本 URL,还包括路径)可能会占用大量资源。
此外,请确保使用将执行模板的非常有限的结构。 仅使用原始类型(因此将所有 EUI/DevAddr 转换为字符串),避免使用指针。

我认为我们可以使用 Webhook ID + updated_at缓存模板本身,以避免每次都重新编译模板。 此外,确实只有字符串应该传递给模板本身(我希望我们不要使用标识符之外的任何其他内容)。

我认为有两种选择;

  • text/template与此用例特定的非常简单的结构一起使用。 即,不要通过*ttnpb.ApplicationUp而是只传递我们支持的东西WebhookTemplateFields
  • 在已知字段上使用字符串替换。 超级快,结果一样

如果我们选择第二种,那么我们可能根本不应该使用 Go 模板语法,因为那只会让人们感到困惑(为什么是点?它是用空格填充的吗?)。

如果我们想保持验证规则相同,我们可以考虑使用像$app_id这样的占位符。 这样占位符在主机中无效(因为我们不希望那样),但它们在路径中有效(我认为在 URL 路径中允许使用$ ,我们需要检查)。

根据RFC3986 第 2.2 节$作为主机和路径的一部分均有效。 话虽如此,我们不会被迫解析url.URL的主机部分。

URI 模板的标准(根据RFC 6570 ,参见 1.2 和 2.2)语法是{[operator]variable-list} 。 由于我们在热点地区工作,我确实认为这是一个很好的理由来删除操作符(因为它们需要扩展处理),并且只允许一个变量。 这允许我们使用string.ReplaceAll而无需重新发明轮子。

“允许一个变量”是什么意思?

我还认为,从用户体验的角度来看,不使用text/template会更好,除了性能受到影响。 我对 PHP 风格的变量名很好。

上面提到的标准将允许诸如{appEUI,devEUI}之类的表达式,这将不允许我们使用简单的字符串替换。 请注意,我没有禁止诸如{appEUI}/{devEUI}之类的表达式,每次捕获只有一个变量,并且非常好。

那是一个内部包,不能在主包之外导入,但应该这样做。
编辑:主包也公开了该功能。

此页面是否有帮助?
0 / 5 - 0 等级