Vertx Web:如何跨多个文件拆分和组织路由?
Vertx Web: How to split and organize routes across multiple files?
到目前为止,我真的很喜欢 Vertx。文档很棒,跨语言支持也很棒。
但是,针对我的特定问题的示例和文档似乎都已过时。我想 API 自 3.4.x
以来发生了一些变化(我目前正在使用 3.9.1
和 Scala 2.13.1
。
我希望能够将我的路线拆分到多个文件中,以便让事情井井有条。例如,我想要一个 UserRoutes
文件,并为 TodoRoutes
创建一个单独的文件,这两个文件都可以在我的 ServerVerticle
.
中使用
我发现这样做的唯一方法基本上是:
用户路线:
object UserRoutes {
def createUser(context: RoutingContext): Unit = {
// do work
}
def login(context: RoutingContext): Unit = {
// do work
}
}
ServerVerticle:
class ServerVerticle(vertx: Vertx) extends AbstractVerticle {
override def start(): Unit = {
val router: Router = Router.router(vertx)
router.post("/user/new").handle(UserRoutes.createUser)
router.post("/user/login").handle(UserRoutes.login)
....
}
}
我真正想做的是:
object UserRoutes {
// somehow get a reference to `router` or create a new one
router.post("/user/new", (context: RoutingContext) => {
// do work
})
router.post("/user/login", (context: RoutingContext) => {
// do work
})
}
我更喜欢这个的原因是这样更容易准确地看到 UserRoutes
中正在做什么,例如正在使用什么路径,需要什么参数等。
我尝试采用与 this example application 类似的方法,但显然这对于 Vertx API 是不可能的,因为它存在于 3.9
?
最好的方法是什么?我错过了什么?大型 REST API 如何拆分它们的路由?
我想这样做的一种方法如下所示:
用户路由
class UserRoutes(vertx: Vertx) {
val router: Router = {
val router = Router.router(vertx)
router.get("/users/login").handler(context => {
// do work
})
router
}
}
然后在ServerVerticle中:
...
server
.requestHandler(new UserVerticle(vertx).router)
.requestHandler(new TodoVerticle(vertx).router)
.listen(...)
这很好地分解了内容,但我仍然需要找到一个合适的方法来避免在每个 ___Routes
文件中重复 cors
选项和内容。当然有很多方法可以做到这一点,但问题仍然存在:这是正确的方法吗?
此外,我真的可以混合最初问题中概述的方法的某些部分。 UserRoutes
class 仍然可以有 createUser()
方法,我可以简单地在 apply()
调用或其他地方使用它。
子路由器是另一种方法,但 there are still some issues with this。
如果每个 ___Routes
文件都可以创建自己的 Verticle,那就太好了。如果每组路由 运行 在它自己的线程上,这可以很好地加快速度。
说实话...在 Scala 中,有很多方法可以解决这个问题。但哪个是最好的,当我们想要的时候:
- 逻辑组织
- 利用 Vertx 的优势
- 也许是子垂直?
- 避免共享状态
我需要指导!选项太多不知道从何下手
到目前为止,我真的很喜欢 Vertx。文档很棒,跨语言支持也很棒。
但是,针对我的特定问题的示例和文档似乎都已过时。我想 API 自 3.4.x
以来发生了一些变化(我目前正在使用 3.9.1
和 Scala 2.13.1
。
我希望能够将我的路线拆分到多个文件中,以便让事情井井有条。例如,我想要一个 UserRoutes
文件,并为 TodoRoutes
创建一个单独的文件,这两个文件都可以在我的 ServerVerticle
.
我发现这样做的唯一方法基本上是:
用户路线:
object UserRoutes {
def createUser(context: RoutingContext): Unit = {
// do work
}
def login(context: RoutingContext): Unit = {
// do work
}
}
ServerVerticle:
class ServerVerticle(vertx: Vertx) extends AbstractVerticle {
override def start(): Unit = {
val router: Router = Router.router(vertx)
router.post("/user/new").handle(UserRoutes.createUser)
router.post("/user/login").handle(UserRoutes.login)
....
}
}
我真正想做的是:
object UserRoutes {
// somehow get a reference to `router` or create a new one
router.post("/user/new", (context: RoutingContext) => {
// do work
})
router.post("/user/login", (context: RoutingContext) => {
// do work
})
}
我更喜欢这个的原因是这样更容易准确地看到 UserRoutes
中正在做什么,例如正在使用什么路径,需要什么参数等。
我尝试采用与 this example application 类似的方法,但显然这对于 Vertx API 是不可能的,因为它存在于 3.9
?
最好的方法是什么?我错过了什么?大型 REST API 如何拆分它们的路由?
我想这样做的一种方法如下所示:
用户路由
class UserRoutes(vertx: Vertx) {
val router: Router = {
val router = Router.router(vertx)
router.get("/users/login").handler(context => {
// do work
})
router
}
}
然后在ServerVerticle中:
...
server
.requestHandler(new UserVerticle(vertx).router)
.requestHandler(new TodoVerticle(vertx).router)
.listen(...)
这很好地分解了内容,但我仍然需要找到一个合适的方法来避免在每个 ___Routes
文件中重复 cors
选项和内容。当然有很多方法可以做到这一点,但问题仍然存在:这是正确的方法吗?
此外,我真的可以混合最初问题中概述的方法的某些部分。 UserRoutes
class 仍然可以有 createUser()
方法,我可以简单地在 apply()
调用或其他地方使用它。
子路由器是另一种方法,但 there are still some issues with this。
如果每个 ___Routes
文件都可以创建自己的 Verticle,那就太好了。如果每组路由 运行 在它自己的线程上,这可以很好地加快速度。
说实话...在 Scala 中,有很多方法可以解决这个问题。但哪个是最好的,当我们想要的时候:
- 逻辑组织
- 利用 Vertx 的优势
- 也许是子垂直?
- 避免共享状态
我需要指导!选项太多不知道从何下手