Lorawan-stack: Prise en charge des variables personnalisées dans les URL Webhook

Créé le 16 juil. 2019  ·  9Commentaires  ·  Source: TheThingsNetwork/lorawan-stack

Résumé

Actuellement, l'URL finale d'un webhook est statique, elle ne prend pas en charge les variables personnalisées telles que JoinEUI , DevID , DevEUI et DevAddr . Le résultat devrait être qu'une URL de base pour le webhook telle que http://example.com/app1/wh1 peut devenir http://example.com/app1/wh1/{{.DevEUI}} et permettre au point de terminaison Webhook de mieux acheminer les liaisons montantes. Cela devrait également être applicable à l'intérieur des URL spécifiques au message (message de liaison montante, liaison descendante en file d'attente, etc.)

Pourquoi avons nous besoin de ça?

Cela permettra un meilleur routage des Webhooks et nous permettra également d'écrire certaines intégrations (comme OpenSensors) uniquement en tant que WebHooks.

Qu'y a-t-il déjà ? Que voyez-vous maintenant ?

Prise en charge des URL statiques - BaseURL est joint au sujet en fonction du type de liaison montante, mais il n'y a pas de champs de routage personnalisés.

Que manque-t-il? Qu'est-ce que tu veux voir?

Les champs de routage personnalisés {{.AppEUI}} , {{.JoinEUI}} , {{.DevID}} , {{.DevEUI}} , {{.DevAddr}} .

Environnement

N'est pas applicable.

Comment proposez-vous de mettre cela en œuvre ?

Remplacez les variables personnalisées dans l'URL après la jointure URL de base + URL de configuration dans newRequest.

Pouvez-vous le faire vous-même et soumettre une demande d'extraction ?

Oui.

application server in progress

Tous les 9 commentaires

D'après l'apparence des champs, je soupçonne que vous prévoyiez de l'implémenter avec text/template . Si c'est effectivement le cas, sachez que l'analyse et l'exécution de modèles (surtout s'il ne s'agit pas seulement de l'URL de base mais également du chemin) sur chaque liaison montante peuvent potentiellement nécessiter beaucoup de ressources.
Assurez-vous également d'utiliser une structure très limitée avec laquelle le modèle sera exécuté. N'utilisez que des types primitifs (convertissez donc tous les EUI/DevAddr en chaînes), évitez les pointeurs.

Je pense que nous pouvons mettre en cache le modèle lui-même en utilisant l'ID Webhook + updated_at afin d'éviter de recompiler le modèle à chaque fois. De plus, seules les chaînes doivent être transmises au modèle lui-même (et je préférerais que nous n'utilisions rien d'autre en dehors des identifiants).

Je pense que deux options;

  • Utilisez text/template avec une structure très simple spécifique à ce cas d'utilisation. C'est-à-dire, ne passez pas *ttnpb.ApplicationUp mais WebhookTemplateFields avec seulement les trucs que nous supportons
  • Utilisez le remplacement de chaîne sur les champs connus. Super rapide, même résultat

Si nous optons pour la seconde, nous ne devrions probablement pas utiliser du tout la syntaxe du modèle Go, car cela ne ferait que semer la confusion dans l'esprit des gens (pourquoi le point ? Est-il rempli d'espaces ?).

Si nous voulons conserver les mêmes règles de validation, nous pourrions envisager d'utiliser des espaces réservés comme $app_id . De cette façon, les espaces réservés ne seront pas valides dans l'hôte (parce que nous ne le voulons pas), mais ils seront valides dans le chemin (je pense que $ est autorisé dans les chemins d'URL, nous devons vérifier que ).

$ est valide à la fois en tant que partie de l'hôte et du chemin conformément à la section 2.2 de RFC3986 . Cela étant dit, nous ne sommes pas obligés d'analyser la partie hôte du url.URL .

La syntaxe standard (selon RFC 6570 , voir 1.2 et 2.2) pour les modèles d'URI est {[operator]variable-list} . Étant donné que nous travaillons dans un point chaud, je pense que c'est une bonne justification pour supprimer les opérateurs (car ils nécessiteraient un traitement prolongé) et n'autoriser qu'une seule variable. Cela nous permet d'utiliser string.ReplaceAll sans réinventer la roue.

Que voulez-vous dire par "autoriser une variable" ?

Je pense aussi que du point de vue de l'expérience utilisateur, il est préférable de ne pas utiliser text/template , à part l'impact sur les performances. Je suis d'accord avec les noms de variables de style PHP.

La norme mentionnée ci-dessus autoriserait des expressions telles que {appEUI,devEUI} , ce qui ne nous permettrait pas d'utiliser la simple chaîne de remplacement. Notez que je n'ai pas interdit les expressions telles que {appEUI}/{devEUI} , qui n'ont qu'une seule variable par capture, et sont parfaitement correctes.

Celui-ci est un package interne et ne peut pas être importé en dehors du package principal, mais cela devrait le faire.
Edit : le package principal expose également la fonction.

Cette page vous a été utile?
0 / 5 - 0 notes