当我使用Spray.io开发RESTful API时,我应该如何构建我的应用程序?
我已经看到了关于如何拆分Spray应用程序的这个答案,但我对此并不满意,因为它似乎没有使用"每个请求的一个actor"方法.我可以根据路径将根执行者的请求转发给我的应用程序中的其他actor,并在这些actor中定义相关的路由吗?
谢谢
您当然可以根据路径或其他任何方式将请求从一个actor转发到另一个actor.看看我的示例项目(这是一个示例项目的fork的分支):
https://github.com/gangstead/spray-moviedb/blob/master/src/main/scala/com/example/routes/ApiRouter.scala
来自主actor的相关代码,它接收所有请求并将它们路由到处理每个服务的其他actor:
def receive = runRoute { compressResponseIfRequested(){ alwaysCache(simpleCache) { pathPrefix("movies") { ctx => asb.moviesRoute ! ctx } ~ pathPrefix("people") { ctx => asb.peopleRoute ! ctx } } ~ pathPrefix("login") { ctx => asb.loginRoute ! ctx } ~ pathPrefix("account") { ctx => asb.accountRoute ! ctx } } }
例如电影路线:
def receive = runRoute { get { parameters('query, 'page ? 1).as(TitleSearchQuery) { query => val titleSearchResults = ms.getTitleSearchResults(query) complete(titleSearchResults) }~ path(LongNumber) { movieId => val movie = ms.getMovie(movieId) complete(movie) }~ path(LongNumber / "cast") { movieId => val movieCast = ms.getMovieCast(movieId) complete(movieCast) }~ path(LongNumber / "trailers") { movieId => val trailers = ms.getTrailers(movieId) complete(trailers) } } }