假设我在Scala中已经运行了一个基于Play 2.0框架的应用程序,它可以提供以下URL:
http://localhost:9000/birthdays
它以所有已知生日的列表作出回应
我现在想通过添加使用可选的“from”(日期)和“to”请求参数限制结果的功能来增强此功能,例如
http://localhost:9000/birthdays?from=20120131&to=20120229
(此处的日期解释为yyyyMMdd)
我的问题是如何使用Scala处理Play 2.0中的请求参数绑定和解释,特别是考虑到这两个参数都应该是可选的 .
这些参数应该以某种方式在“路线”规范中表达吗?或者,响应的Controller方法应该以某种方式从请求对象中分离出params吗?还有另一种方法吗?
6 回答
将可选参数编码为
Option[String]
(或Option[java.util.Date]
,但您必须实现自己的QueryStringBindable[Date]
):并声明以下路线:
为Java用户执行此操作可能不太简洁的方法是设置默认值:
并在控制器中
还有一个问题,每当您链接到模板中的页面时,您都必须重复默认值
除了Julien 's answer. If you don' t想要将它包含在路径文件中 .
您可以使用RequestHeader在控制器方法中获取此属性
这将为您提供所需的请求参数,并保持路由文件清洁 .
这里是朱利安用java重写的例子,使用F.Option :(作为播放2.1)
路线:
您也可以选择任意查询参数作为字符串(您必须自己进行类型转换):
对于可选的Query参数,您可以这样做
在routes文件中,声明API
您还可以给出一些默认值,如果API不包含这些查询参数,它会自动为这些参数分配默认值
在控制器内部编写的方法中,如果没有为默认值分配默认值,这些参数将具有值
null
.我这样做的方法是使用自定义
QueryStringBindable
. 这样我在路线中表达参数:Period的代码如下所示 .
如果我想对查询应用日期过滤,
applyDateFilter
只是我在控制器中使用的一种便利方法 . 显然,您可以在此处使用其他日期默认值,或者在bind
方法中使用除null之外的其他默认值作为开始日期和结束日期 .