如何在Play框架中处理可选的查询参数

mag*_*can 68 scala playframework playframework-2.0

假设我在Scala中已经运行了一个基于Play 2.0框架的应用程序,它可以提供以下URL:

HTTP://本地主机:9000 /生日

它以所有已知生日的列表作出回应

我现在想通过添加使用可选的"from"(日期)和"to"请求参数限制结果的功能来增强此功能,例如

HTTP://本地主机:9000 /生日从= 20120131&到= 20120229?

(此处的日期解释为yyyyMMdd)

我的问题是如何使用Scala处理Play 2.0中的请求参数绑定和解释,特别是考虑到这两个参数都应该是可选的.

这些参数应该以某种方式在"路线"规范中表达吗?或者,响应的Controller方法应该以某种方式从请求对象中分离出params吗?还有另一种方法吗?

Jul*_*Foy 60

将可选参数编​​码为Option[String](或者Option[java.util.Date],您必须实现自己的参数QueryStringBindable[Date]):

def birthdays(from: Option[String], to: Option[String]) = Action {
  // …
}
Run Code Online (Sandbox Code Playgroud)

并声明以下路线:

GET   /birthday       controllers.Application.birthday(from: Option[String], to: Option[String])
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,这还不足以进行没有参数的路由.我将它扩展为`GET/birthday controllers.Application.birthday(from:Option [String]?= None,to:Option [String]?= None)` (8认同)

Som*_*tik 18

为Java用户执行此操作可能不太简洁的方法是设置默认值:

GET  /users  controllers.Application.users(max:java.lang.Integer ?= 50, page:java.lang.Integer ?= 0)
Run Code Online (Sandbox Code Playgroud)

并在控制器中

public static Result users(Integer max, Integer page) {...}
Run Code Online (Sandbox Code Playgroud)

还有一个问题,每当您链接到模板中的页面时,您都必须重复默认值

@routes.Application.users(max = 50, page = 0)
Run Code Online (Sandbox Code Playgroud)

  • 在Java中,您可以使用`play.libs.F.Option`而不是Scala`Option` (6认同)

Dav*_*jan 11

除了朱利安的回答.如果您不想将其包含在路径文件中.

您可以使用RequestHeader在控制器方法中获取此属性

String from = request().getQueryString("from");
String to = request().getQueryString("to");
Run Code Online (Sandbox Code Playgroud)

这将为您提供所需的请求参数,并保持路由文件清洁.


Max*_*Max 7

这里是朱利安用java重写的例子,使用F.Option :(作为播放2.1)

import play.libs.F.Option;
public static Result birthdays(Option<String> from, Option<String> to) {
  // …
}
Run Code Online (Sandbox Code Playgroud)

路线:

GET   /birthday       controllers.Application.birthday(from: play.libs.F.Option[String], to: play.libs.F.Option[String])
Run Code Online (Sandbox Code Playgroud)

您也可以选择任意查询参数作为字符串(您必须自己进行类型转换):

public static Result birthdays(Option<String> from, Option<String> to) {
  String blarg = request().getQueryString("blarg"); // null if not in URL
  // …
}
Run Code Online (Sandbox Code Playgroud)


Him*_*oel 5

对于可选的查询参数,您可以采用这种方式

在路由文件中,声明API

GET   /birthdays     controllers.Application.method(from: Long, to: Long)
Run Code Online (Sandbox Code Playgroud)

您还可以提供一些默认值,以防万一API不包含这些查询参数,它将自动为这些参数分配默认值

GET   /birthdays    controllers.Application.method(from: Long ?= 0, to: Long ?= 10)
Run Code Online (Sandbox Code Playgroud)

在控制器应用程序内部编写的方法中,null如果未分配默认值,则这些参数将具有值,否则将默认值。