目前 webhook 的最终 URL 是静态的,它不支持自定义变量,例如JoinEUI
、 DevID
、 DevEUI
和DevAddr
。 结果应该是 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 中的自定义变量
是的。
根据字段的外观,我怀疑您打算使用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}
之类的表达式,每次捕获只有一个变量,并且非常好。
那是一个内部包,不能在主包之外导入,但应该这样做。
编辑:主包也公开了该功能。