在Play Framework中使用POST路由参数

时间:2013-11-26 15:27:22

标签: playframework playframework-2.2

我有一个登录路由,应该将其输入参数作为POST变量传输。我已经定义了这样的路线:

POST    /v1/accounts/login          controllers.v1.Accounts.login(username: String, password: String)

我的控制器是这样的:

object Accounts extends Controller {
  def login(username: String, password: String) = Action {
    Ok("Foo " + username)
  }
}

当我使用Chromes Advance REST Client测试此路线时,它仅适用于GET参数,而不是我将其作为application/x-www-form-urlencoded POST表单数据发送。

Play Framework documentation实际上从未提及POST参数,但也没有说它不起作用。

我认为如果我创建一个Form并将我的请求绑定到那个,但它似乎不必要地复杂,我认为它可能会起作用。

是否真的无法使用routes文件绑定POST参数?

1 个答案:

答案 0 :(得分:19)

路由=在URL内解析params =通过GET发送params。

这意味着,你正试图发送POST请求... GET params ...这是什么意思?

James Roper 解释说:

  

在路由时,Play尚未使用请求正文,因此未解析提交的表单。 - 并且你也不想要它,因为你的行动决定了请求体如何被解析,流式传输,发送到其他地方,如果Play在路由时这样做,它将限制你在行动中可以做的事情。

从安全的角度来看,将凭证留在客户路径中每台机器的日志中绝对是个坏主意。

相反,您应该采用常见的表单处理方式,如base form documentation中所述:

路线:

POST    /v1/accounts/login      controllers.v1.Accounts.login

动作:

val userForm = Form(
  tuple(
    "username" -> text,
    "password" -> text
  )
)

def login = Action { implicit request =>
  val (username, password) = userForm.bindFromRequest.get
  Ok("Hello " + username + ", you're trying to login with: " + password)
}