Play Framework Routes 中的 Scala 反引号

Posted

技术标签:

【中文标题】Play Framework Routes 中的 Scala 反引号【英文标题】:Scala backticks in Play Framework Routes 【发布时间】:2015-12-16 03:10:16 【问题描述】:

我正在使用 Ember.js 和 Play 作为 API 的单页 Web 应用程序。 Ember 合并这样的请求,?ids[]=401460&ids[]=379610。但是当我尝试在 Play 的路由文件中处理该值时,它实际上期望该值为ids[] 而不是ids。但我不能告诉路由文件寻找ids[],因为它会在[ 上引发错误。我曾尝试像在 scala 代码本身 `ids[]` 中那样使用反引号,但这又会在路由文件中引发错误。

是否可以在路由文件中执行此操作?

GET /api/test      controllers.application.getTests(ids[]:List[Long]) 

我知道我可以这样处理,

 Map<String,String[]> params = request().body().asFormUrlEncoded();

但我更愿意让 Play 做它的事情并在路由文件中处理它,然后将值传递出去。

这完全可能还是使用asFormUrlEncoded 处理它的唯一选项?

更新:(以最少的更改解决)

在玩弄它的时候,我偶然发现了一个事实,即使我不能将它添加到路由文件中的查询字符串参数列表中,它仍然会传递给函数。 因此,如果您使用的是 Ember 或其他名称中与 [] 合并的 JS 库或框架,并且没有使用最新的 Play。不幸的是,这使得在读取路由文件时路由模棱两可,因为您无法判断它是否需要一个值,但在 Play 2.5 准备好 Prod 之前它可以工作。你可以这样处理

别管那个变通了。在重试之前忘记保存文件给了我一些虚假的希望。

【问题讨论】:

【参考方案1】:

这在 Play 2.4.x 中似乎是不可能的。有a test in RoutesFileParserSpec.scala 表明这是可能的:

"parse argument with complex name" in 
  parseRoute("GET /s p.c.m(`b[]`: List[String] ?= [])").call.parameters must_== Some(Seq(
    Parameter("`b[]`", "List[String]", None, Some("[]"))))

但看起来您必须等待 2.5.x。另请参阅此问题:https://github.com/playframework/playframework/issues/4693

【讨论】:

请注意,2.5.0-M1 可用groups.google.com/forum/#!topic/play-framework/CRWoluub3a8 感谢您发现它并告诉我它将在 2.5 中得到支持。由于我的问题是针对 2.4 的,这就是答案。不是我所希望的,而是答案。感谢您的帮助。

以上是关于Play Framework Routes 中的 Scala 反引号的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework - 使用参数重定向

如何将外部Javascript文件链接到Play Framework项目中的html文档?

Play Framework [2.4.x] - 模块路由特定名称因“资产不是包的成员”而失败

Play Framework & IntelliJ - 无法解析符号索引/路由

如何将 CDN 与 Play Framework 2.4 资产一起使用?

Play Framework:如何不查看文件夹以了解 Play Framework 中的更改