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.)
Ini akan memungkinkan perutean Webhooks yang lebih baik dan juga memungkinkan kami untuk menulis integrasi tertentu (seperti OpenSensors) hanya sebagai WebHooks.
Dukungan URL statis - BaseURL
digabungkan dengan topik berdasarkan jenis uplink, tetapi tidak ada bidang perutean khusus.
Bidang perutean khusus {{.AppEUI}}
, {{.JoinEUI}}
, {{.DevID}}
, {{.DevEUI}}
, {{.DevAddr}}
.
Tak dapat diterapkan.
Ganti variabel khusus di URL setelah URL dasar + URL konfigurasi bergabung terjadi di newRequest.
Ya.
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;
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 dukungJika 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.