简而言之,你有很多选择……彼此都有点不同。可以使用以下 URL 格式:
/foo/bar?color=red&color=blue
/foo/bar?color=red,blue
/foo/bar?color=[red,blue]
/foo/bar?color[]=red,blue
您可以:
1.使用播放形式
简单配置:
// form definition
case class ColorParams(colors:Seq[String])
val myForm = Form(formMapping(
"color" -> seq(text(1, 32)))(ColorParams.apply)(ColorParams.unapply)
// in your controller method call
val params = myForm.bindFromRequest()
示例 URL:/foo/bar?color[]=red,blue
将变为List("red","blue")
遗憾的是,这不是那么健壮,因为许多 API 使用该格式color=red,blue
或color=red&color=blue
2.创建自己的自定义查询字符串解析器
更详细,但您可以编写约束、测试并将所有内容留给路由器。优点是无效查询永远不会到达您的控制器。
然后,您只需在 Routes 文件中使用它,例如:
case class ColorParams(colors:List[MyColorEnum])
GET /foo/bar? controllers.Example.getBar(color:ColorParams)
示例网址:/foo/bar?color=red,blue
因为您自己解析字符串,所以您可以使用此方法根据需要在这篇文章中使用许多任何字符串布局。请参阅QueryStringBindable的完整详细信息。稍后我将添加一个完整的示例。
3. 在 Routes 文件中定义你的数组参数
GET /foo/bar? controllers.Example.getBar(color:Seq[String])
// inside Example.scala
def getBar( colors:Seq[String] ) = {
???
}
示例网址:/foo/bar?color=red&color=blue
注意:为了清楚起见,我color
在Routes文件中使用了,这是URL中的名称,但colors
在getBar
方法中。这些名称不必匹配,只需匹配类型即可。
陷阱
请注意,这可能很棘手,因为/foo/bar?color=red,blue
变为 Seq('red,blue'),即一个字符串的 Seq,而不是两个字符串,但它仍会在调试器中显示为Seq(red,blue)
. 在调试器中看到的正确值是Seq(red, blue)
,注意那个空间?棘手。