【问题标题】:Routing design in SpraySpray中的路由设计
【发布时间】:2013-10-04 08:28:39
【问题描述】:

我正在尝试为个人资料管理提供休息服务。所以我有以下个人资料 uri:

host/profile/id123123/:action

但是对于具有不同仪表板的不同用户,有不同的配置文件类型,所以我想提取profileTypeid 作为顶部路径并在此下使用不同的操作。我试过用 DRY 的方式写它:

path(Segment / "id" ~ Segment) { (profileType, id) ⇒
  get {
    profileType match {
      case "admin" ⇒ loadProfilePage[Admin](id)
    }
  } ~
  path("update") {
    complete("Profile updated")
  }
}

但如果我在地址栏中输入以下内容:

localhost/admin/id123123/update

它抛出服务器异常。有什么问题?

【问题讨论】:

    标签: scala rest routing spray


    【解决方案1】:

    您的路由结构错误。如果您想在某个共同路径下对不同路径有不同的逻辑,在您的情况下为path(Segment / "id" ~ Segment),那么您需要使用pathPrefix 指令。那么正确的路线应该是这样的:

    pathPrefix(Segment / "id" ~ Segment) { (profileType, id) ⇒
      path("") {
        get {
          profileType match {
            case "admin" ⇒ loadProfilePage[Admin](id)
          }
        }
      } ~
      path("update") {
        complete("Profile updated")
      }
    }
    

    但是还是提前提取不是一件好事,如果你有一个非常复杂的路由结构,这会降低整体性能,不多,但是你的内部路由,在提取点之后,会被动态评估。

    更新

    我只是稍微优化了一下。我认为您将不仅拥有update 路径,而且还有其他路径。因此,在这种情况下,采用以下路线会更干净:

    pathPrefix(Segment / "id" ~ Segment) { (profileType, id) ⇒
      (get | put) {
        profileType match {
          case "user" ⇒
            path("")(loadProfilePage[User](id)) ~
            path("update")(updateProfile[User](id)) ~
            path("delete")(deleteProfile[User](id)
          }
        }
      }
    }
    

    这仍然不是一个完美的方法,我会进一步概括它,因为据我所知,唯一会改变的是profileType

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多