1

我正在尝试为配置文件管理提供休息服务。所以我有以下配置文件的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

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

4

1 回答 1

6

你有错误的路由结构。如果您想在某个共同路径下对不同路径有不同的逻辑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

于 2013-10-04T08:35:46.843 回答