注意:我不是经验丰富的 Scala 开发人员,所以也许可以优化呈现的片段......对你来说重要的是它们是有效的并且可以工作。
所以...
您不需要在routes
文件中声明每个可选参数。这是类型参数验证的绝佳捷径,最好的选择是说服“其他公司”使用您准备的 API……无论如何,如果您没有这种可能性,您也可以根据需要处理他们的请求。
一般来说:调度程序方法似乎在这个地方是正确的,幸运的是你不需要在中声明所有可选参数routes
并在动作/方法之间传递它,因为它们可以直接从请求中获取。在 PHP 中,它可以与$_GET['action']
Play 2 控制器 -DynamicForm
类 -的 Java 版本进行比较form().bindFromRequest.get("action")
。
假设您有一条路线:
GET /dispatcher controllers.Application.dispatcher
在这种情况下,您的调度程序操作(和其他方法)可能如下所示:
def dispatcher = Action { implicit request =>
request.queryString.get("action").flatMap(_.headOption).getOrElse("invalid") match {
case "sayHello" => sayHelloMethod
case "newUser" => newUserMethod
case _ => BadRequest("Action not allowed!")
}
}
// http://localhost:9000/dispatcher?action=sayHello&name=John
def sayHelloMethod(implicit request: RequestHeader) = {
val name = request.queryString.get("name").flatMap(_.headOption).getOrElse("")
Ok("Hello " + name )
}
// http://localhost:9000/dispatcher?action=newUser&name=John+Doe&address=john@doe.com
def newUserMethod(implicit request: RequestHeader) = {
val name = request.queryString.get("name").flatMap(_.headOption).getOrElse("")
val address = request.queryString.get("address").flatMap(_.headOption).getOrElse("")
Ok("We are creating new user " + name + " with address " + address)
}
当然,您将需要“手动”验证传入的类型和值,尤其是当操作将在数据库上运行时,无论如何您现在已经解决了大部分问题。