tgoop.com/orgprog/384
Create:
Last Update:
Last Update:
Именованный роутинг
Как в большинстве бекенд фреймворков определяются роуты? Мы описываем шаблон маршрута, например, /products/:id, который связываем с обработчиком. Например:
fastify.get('/products/:id', (request, reply) {
return { hello: 'world' }
})
Это все хорошо работает, до тех пор, пока нам не нужно на эти маршруты ссылаться. Что мне придется сделать, если из одного такого обработчика, понадобится сделать редирект куда-то? Почти наверняка это будет конкатенация или интерполяция чтобы собрать нужный адрес:
const url = "/products" + id. И все, приплыли.Никаких гарантий, что это будет работать. Поменяли маршрут в одном месте, в других все поломалось и без хороших тестов или ручной проверки этого не отследить. Я уже не говорю про отсутствие автокомплита, придется каждый раз искать, а что там за маршрут.
С фронтендом будет похожая ситуация, если не используется какая-нибудь автогенерация sdk по openapi. В этом случае серверные маршруты где-то будут хардкодиться напрямую в клиентских приложениях.
Что собственно делать? Если фреймворк поддерживает именованные маршруты, то использовать их, если нет - найти либы, которые добавляют такую поддержку в ваш фреймворк. Либо встроить эту поддержку если вам интересен опенсорс.
/func main() {
app := fiber.New()
// Именованный маршрут
app.Get("/users/:id", func(c *fiber.Ctx) error {
return c.SendString("User " + c.Params("id"))
}).Name("user.show")
// Генерация URL по имени
app.Get("/", func(c *fiber.Ctx) error {
url := app.GetRoute("user.show").URL(fiber.Map{
"id": "42",
})
return c.SendString("URL: " + url)
})
app.Listen(":3000")
}
⁃ Gin (go): поддержки нет, но люди хотят https://github.com/gin-gonic/gin/issues/3795
⁃ Spring Boot (java): поддержка есть из коробки, но сборка урла многословная
⁃ В Rails, Laravel, Django встроенная поддержка
Но это только на уровне бека. А что насчет фронта? Под некоторые фреймворки реализованы либы, которые берут серверный роутинг и переносят его во фронтенд причем с типами ts, например для рельсы мы юзаем https://github.com/railsware/js-routes. Я знаю что такой же есть в пыхе.
import { post_path } from '../routes';
alert(post_path(1))
Ссылки: Телеграм | Youtube | VK
BY Организованное программирование | Кирилл Мокевнин
Share with your friend now:
tgoop.com/orgprog/384
