【问题标题】:How to define sub-resources routing in Scalatra如何在 Scalatra 中定义子资源路由
【发布时间】:2024-09-05 17:15:02
【问题描述】:

我有 REST 资源,例如 authorarticle。可以有多个Authors,每个author可以拥有多个articles。我知道可以在一个 servlet 中为他们的 Scalatra 处理程序建模,例如

  • /author/:id/article
  • /author/:id/article/:id

等等。但是这样做我的servlet文件会变大。看起来author 下的所有内容都需要在一个 servlet 中处理。

我想把这些东西分成几个独立的 servlet,当它们一起注册时,它们将构成整个资源地址。所以我想在一个 servlet 中包含与 author 相关的内容,在另一个 servlet 中包含与 article 相关的内容。

有没有办法在 Scalatra 中做到这一点?我发现了关于 Sinatra 的类似问题,但没有很好的答案 Sub routing in Sinatra

【问题讨论】:

    标签: scala rest scalatra


    【解决方案1】:

    您应该可以随意设置 servlet 和路由。

    例如,您可能会设置两个 servlet,如下所示:

    class AuthorsServlet extends WebStack {
      get("/authors") { }
    
      get("/authors/:id") { }
    }
    
    class ArticlesServlet extends WebStack {
      get("/authors/:authorId/articles") { }
    
      get("/authors/:authorId/articles/:id) { }
    
    }
    

    然后在 ScalatraBootstrap 中注册您的 servlet:

    override def init(context: ServletContext) {
      context.mount(new AuthorsServlet, "/*")
      context.mount(new ArticlesServlet, "/*")
    }
    

    【讨论】:

    • 这对 2.3 仍然有效吗?不知何故,它似​​乎不起作用,路由总是在第一个安装的 servlet 上匹配。