我正在Scala中编写Play 2.3.2应用程序。
在我的应用程序中,我正在编写一个调用其他控制器方法的方法,如下所示:
def addTagToUser = CorsAction.async { request =>
implicit val userRestFormat = UserFormatters.restFormatter
implicit val inputFormat = InputFormatters.restFormatter
implicit val outputWriter = OutputFormatters.restWriter
//update the tag of a user
def updateTagToUserDB(value: JsValue): Future[Boolean] = {
val holder : WSRequestHolder = WS.url("http://localhost:9000/recommendation/ advise")
val complexHolder = holder.withHeaders("Content-Type" -> "application/json")
complexHolder.post(value).map(response => response.status match {//handle the response
case 200 => true
case _ => false
}
)
}
val jsonData = request.body.asJson //get the json data
jsonData match {
case Some(x) => x.validate[Input] match {
case JsSuccess(input, _) => updateTagToUserDB(x).flatMap(status => status match {
case true => Future{Ok}
case _ => Future{InternalServerError("Error on update the users tags")}
})
case e: JsError => Future{BadRequest("json bad formed")}
}
case None => Future{BadRequest("need a json value")}
}
}
但是在这段代码中,我遇到的问题是url是create static,有可能在Play中获得Controller方法的绝对uri吗?
我该怎么做?
答案 0 :(得分:1)
正如Play文档的reverse routing部分所述,您可以通过以下方法调用来实现此目的:
routes.Application.advise()
请注意routes
中存在controllers
,因此,如果您使用的是controllers
个套餐,则可以使用routes.ControllerName.methodName
访问反向路线。
从代码的其他部分,您需要使用完全限定的包,即controllers.reverse.Application.advise()
。
如果controller方法接受参数,则需要传递所需的参数并获取实际路径,例如routes.Application.someMethod(10)
。
反向路由是Play工具箱中的一项强大资产,可让您免于重复自己。从某种意义上说,它是未来的证明,如果您更改路线,更改将自动反映到整个应用程序。
这种方法可能不是最佳方法。
重定向到另一个控制器是有意义的,但是将请求发送到位于同一个Web应用程序内的另一个控制器是过度和不必要的。如果您的网络应用程序向外部提供响应而不是请求自己的响应,那将更为明智。
您可以通过将公共逻辑放在其他位置并从两个控制器中使用它来轻松避免它。根据最佳实践,一个好的控制器是一个很薄的!通过更好的分层生活将更容易。