Lorawan-stack: Compatibilidad con variables personalizadas en URL de webhook

Creado en 16 jul. 2019  ·  9Comentarios  ·  Fuente: TheThingsNetwork/lorawan-stack

Resumen

Actualmente, la URL final de un webhook es estática, no admite variables personalizadas como JoinEUI , DevID , DevEUI y DevAddr . El resultado debería ser que una URL base para el webhook como http://example.com/app1/wh1 puede convertirse en http://example.com/app1/wh1/{{.DevEUI}} y permitir que el extremo del webhook enrute mejor los enlaces ascendentes. Esto también debería ser aplicable dentro de las URL específicas del mensaje (mensaje de enlace ascendente, enlace descendente en cola, etc.)

¿Porqué necesitamos esto?

Esto permitirá un mejor enrutamiento de los Webhooks y también nos permitirá escribir ciertas integraciones (como OpenSensors) solo como WebHooks.

¿Qué ya hay? ¿Qué ves ahora?

Compatibilidad con URL estática: BaseURL se une al tema en función del tipo de enlace ascendente, pero no hay campos de enrutamiento personalizados.

¿Lo que falta? ¿Qué quieres ver?

Los campos de enrutamiento personalizados {{.AppEUI}} , {{.JoinEUI}} , {{.DevID}} , {{.DevEUI}} , {{.DevAddr}} .

Ambiente

No aplica.

¿Cómo propone implementar esto?

Reemplace las variables personalizadas en la URL después de que se produzca la combinación de URL base + URL de configuración en newRequest.

¿Puedes hacerlo tú mismo y enviar una solicitud de extracción?

Si.

application server in progress

Todos 9 comentarios

Según el aspecto de los campos, sospecho que planeaba implementar esto con text/template . Si ese es realmente el caso, tenga en cuenta el hecho de que analizar y ejecutar plantillas (especialmente si no es solo la URL base sino también la ruta) en cada enlace ascendente puede consumir muchos recursos.
Además, asegúrese de usar una estructura muy limitada con la que se ejecutará la plantilla. Use solo tipos primitivos (así que convierta todos los EUI/DevAddr en cadenas), evite los punteros.

Creo que podemos almacenar en caché la plantilla en sí usando el ID de Webhook + updated_at para evitar volver a compilar la plantilla cada vez. También es cierto que solo se deben pasar cadenas a la plantilla en sí (y preferiría que no usemos nada más fuera de los identificadores).

Pienso en dos opciones;

  • Use text/template con una estructura muy simple específica para este caso de uso. Es decir, no pase *ttnpb.ApplicationUp sino WebhookTemplateFields solo con las cosas que admitimos
  • Use el reemplazo de cadena en los campos conocidos. Súper rápido, mismo resultado

Si optamos por el segundo, entonces probablemente no deberíamos usar la sintaxis de la plantilla Go en absoluto, porque eso solo confundiría a las personas (¿por qué el punto? ¿Está relleno con espacios?).

Si queremos mantener las mismas reglas de validación, podríamos considerar usar marcadores de posición como $app_id . De esa manera, los marcadores de posición no serán válidos en el host (porque no queremos eso), pero serán válidos en la ruta (creo que $ está permitido en las rutas de URL, debemos verificar que ).

$ es válido tanto como parte del host como de la ruta según RFC3986 sección 2.2 . Dicho esto, no estamos obligados a analizar la parte del host de url.URL .

La sintaxis estándar (según RFC 6570 , consulte 1.2 y 2.2) para las plantillas de URI es {[operator]variable-list} . Dado que estamos trabajando en un punto crítico, creo que esta es una buena justificación para descartar los operadores (ya que requerirían un procesamiento prolongado) y permitir solo una variable. Esto nos permite usar string.ReplaceAll sin reinventar la rueda.

¿Qué quieres decir con "permitir una variable"?

También creo que, en cuanto a la experiencia del usuario, es mejor no usar text/template , aparte del impacto en el rendimiento. Estoy bien con los nombres de variables de estilo PHP.

El estándar mencionado anteriormente permitiría expresiones como {appEUI,devEUI} , lo que no nos permitiría usar el reemplazo de cadena simple. Tenga en cuenta que no deseché expresiones como {appEUI}/{devEUI} , que tienen solo una variable por captura y están perfectamente bien.

Ese es un paquete interno y no se puede importar fuera del paquete principal, pero esto debería hacerlo.
Editar: el paquete principal también expone la función.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

kschiffer picture kschiffer  ·  7Comentarios

johanstokking picture johanstokking  ·  8Comentarios

johanstokking picture johanstokking  ·  8Comentarios

w4tsn picture w4tsn  ·  6Comentarios

ZeroSum24 picture ZeroSum24  ·  3Comentarios