Lorawan-stack: Dukungan variabel khusus di URL Webhook

Dibuat pada 16 Jul 2019  ·  9Komentar  ·  Sumber: TheThingsNetwork/lorawan-stack

Ringkasan

Saat ini URL final webhook adalah statis, tidak mendukung variabel khusus seperti JoinEUI , DevID , DevEUI dan DevAddr . Hasilnya adalah URL dasar untuk webhook seperti http://example.com/app1/wh1 dapat menjadi http://example.com/app1/wh1/{{.DevEUI}} dan memungkinkan titik akhir Webhook merutekan uplink dengan lebih baik. Ini juga harus berlaku di dalam URL khusus pesan (pesan uplink, downlink antri, dll.)

Kenapa kita perlu ini?

Ini akan memungkinkan perutean Webhooks yang lebih baik dan juga memungkinkan kami untuk menulis integrasi tertentu (seperti OpenSensors) hanya sebagai WebHooks.

Apa yang sudah ada? Apa yang kamu lihat sekarang?

Dukungan URL statis - BaseURL digabungkan dengan topik berdasarkan jenis uplink, tetapi tidak ada bidang perutean khusus.

Apa yang hilang? Apa yang ingin kau lihat?

Bidang perutean khusus {{.AppEUI}} , {{.JoinEUI}} , {{.DevID}} , {{.DevEUI}} , {{.DevAddr}} .

Lingkungan

Tak dapat diterapkan.

Bagaimana Anda mengusulkan untuk menerapkan ini?

Ganti variabel khusus di URL setelah URL dasar + URL konfigurasi bergabung terjadi di newRequest.

Bisakah Anda melakukannya sendiri dan mengajukan Permintaan Tarik?

Ya.

application server in progress

Semua 9 komentar

Berdasarkan tampilan bidang, saya menduga Anda berencana mengimplementasikan ini dengan text/template . Jika memang demikian, harap perhatikan fakta bahwa penguraian dan eksekusi template (terutama jika bukan hanya URL dasar tetapi juga jalurnya) pada setiap uplink berpotensi menghabiskan banyak sumber daya.
Juga, pastikan untuk menggunakan struct yang sangat terbatas tempat template akan dieksekusi. Gunakan hanya tipe primitif (jadi konversi semua EUI/DevAddr ke string), hindari pointer.

Saya pikir kita dapat men-cache template itu sendiri menggunakan ID Webhook + updated_at untuk menghindari kompilasi ulang template setiap saat. Juga memang kasus bahwa hanya string yang harus diteruskan ke template itu sendiri (dan saya lebih suka kita tidak menggunakan apa pun di luar pengidentifikasi).

Saya pikir dua pilihan;

  • Gunakan text/template dengan struct yang sangat sederhana khusus untuk kasus penggunaan ini. Yaitu, jangan lulus *ttnpb.ApplicationUp tetapi WebhookTemplateFields hanya dengan hal-hal yang kami dukung
  • Gunakan penggantian string pada bidang yang diketahui. Super cepat, hasil yang sama

Jika kita memilih yang kedua, maka kita mungkin tidak boleh menggunakan sintaks template Go sama sekali, karena itu hanya akan membingungkan orang (mengapa titiknya diisi dengan spasi?).

Jika kita ingin menjaga aturan validasi tetap sama, kita dapat mempertimbangkan untuk menggunakan placeholder seperti $app_id . Dengan begitu placeholder tidak akan valid di Host (karena kami tidak menginginkannya), tetapi mereka akan valid di jalur (saya pikir $ diizinkan di jalur URL, kami perlu memeriksanya ).

$ valid baik sebagai bagian dari Host dan jalur sesuai RFC3986 bagian 2.2 . Dengan itu, kami tidak dipaksa untuk mengurai bagian host dari url.URL .

Sintaks standar (sesuai RFC 6570 , lihat 1.2 dan 2.2) untuk template URI adalah {[operator]variable-list} . Karena kami bekerja di hot spot, saya yakin ini adalah pembenaran yang baik untuk menjatuhkan operator (karena mereka akan memerlukan pemrosesan yang diperpanjang), dan hanya mengizinkan satu variabel. Ini memungkinkan kita untuk menggunakan string.ReplaceAll tanpa menciptakan kembali roda.

Apa yang Anda maksud dengan "izinkan satu variabel"?

Saya juga berpikir bahwa dari segi pengalaman pengguna, lebih baik tidak menggunakan text/template , selain dari hit kinerja. Saya baik-baik saja dengan nama variabel gaya PHP.

Standar yang disebutkan di atas akan memungkinkan ekspresi seperti {appEUI,devEUI} , yang tidak memungkinkan kita untuk menggunakan penggantian string sederhana. Perhatikan bahwa saya tidak melarang ekspresi seperti {appEUI}/{devEUI} , yang hanya memiliki satu variabel per tangkapan, dan baik-baik saja.

Yang itu adalah paket internal dan tidak dapat diimpor di luar paket utama, tetapi ini harus dilakukan.
Sunting: Paket utama juga memperlihatkan fungsinya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

johanstokking picture johanstokking  ·  5Komentar

htdvisser picture htdvisser  ·  4Komentar

thinkOfaNumber picture thinkOfaNumber  ·  4Komentar

bafonins picture bafonins  ·  5Komentar

johanstokking picture johanstokking  ·  8Komentar