首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Play框架中基于查询参数的路由

Play框架中基于查询参数的路由
EN

Stack Overflow用户
提问于 2013-03-28 22:46:37
回答 2查看 7.6K关注 0票数 8

我的web应用程序将从外部系统触发。它将调用我的应用程序的一个请求路径,但对不同类型的请求使用不同的查询参数。

其中一个参数是定义要做什么的"action“。其余的参数依赖于"action“。

所以我可以像这样得到请求参数:

代码语言:javascript
运行
复制
action=sayHello&user=Joe
action=newUser&name=Joe&address=xxx
action=resetPassword
...

我希望能够在routes文件中对它进行类似的编码,这样它就可以执行基于查询参数的路由,并尽可能多地验证其他参数。

取而代之的是,对于所有这些可能性,我只有一个路由,其中包含大量的可选参数。动作处理从一个大的模式匹配开始,进行分派和参数验证。

谷歌搜索和检查只是弹出了大量的样本,其中的参数以某种方式编码在请求路径中,因此多个路径被路由到相同的操作,但我希望相反:一条路径被路由到不同的操作。

我的一位同事说,我们可以有一个"dispatcher“操作,它只是根据" action”参数进行重定向。它将比当前的解决方案更结构化一些,但它不会消除应该选择性地传递给下一个操作的可选参数的长长列表,所以我希望有人知道更好的解决方案:-)

顺便说一句,调用我的应用程序的外部系统是由另一家公司开发的,我对这种设计没有任何影响,所以不能选择改变我的应用程序的触发方式。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-29 01:13:38

单个dispatcher操作可能是可行的,并且您不需要在路由中指定所有可选参数。如果action总是在那里,那么这就是您真正需要的唯一一个。

代码语言:javascript
运行
复制
GET  /someRoute      controller.dispatcher(action: String)

然后,在您的操作方法中,您可以访问request.queryString来获取任何其他可选参数。

票数 6
EN

Stack Overflow用户

发布于 2013-03-29 01:38:51

注意:我是不是经验丰富的Scala开发人员,所以可能呈现的代码片段可以进行优化...对你来说重要的是,它们是有效的和有效的。

So...

您不需要在routes文件中声明每个可选参数。对于类型参数的验证,这是一个很好的捷径,最好的选择是说服其他公司使用你准备的API……无论如何,如果你没有这样的可能性,你也可以根据需要处理他们的请求。

总而言之: dispatcher方法在这方面似乎是正确的,幸运的是,您不需要在routes中声明所有可选参数并在操作/方法之间传递它,因为它们可以直接从请求中获取。在PHP中,它可以与$_GET['action']和Java版本的play2控制器-- DynamicForm类-- form().bindFromRequest.get("action")进行比较。

假设您有一条路由:

代码语言:javascript
运行
复制
GET     /dispatcher      controllers.Application.dispatcher

在这种情况下,您的调度程序操作(和其他方法)可能如下所示:

代码语言:javascript
运行
复制
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)
}

当然,您将需要“手动”验证传入的类型和值,特别是当操作将在DataBase上操作时,不管怎样,您现在已经解决了问题的最大部分。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15684854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档