在Play Framework中使用POST路由参数

Mat*_*ias 10 playframework playframework-2.2

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

POST    /v1/accounts/login          controllers.v1.Accounts.login(username: String, password: String)
Run Code Online (Sandbox Code Playgroud)

我的控制器是这样的:

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

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

播放Framework文档实际上从未提到POST参数,但它也没有说,这是行不通的.

我认为如果我创建一个Form并将我的请求绑定到那个可能会让它工作,但这似乎是不必要的复杂.

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

bie*_*ior 19

Route =解析URL内的params =通过GET发送params.

这意味着,你正试图发送POST请求...... GET params ......哪里有意义?

James Roper解释说:

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

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

相反,您应该使用基本表单文档中描述的常见表单处理方式:

路线:

POST    /v1/accounts/login      controllers.v1.Accounts.login
Run Code Online (Sandbox Code Playgroud)

行动:

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)
}
Run Code Online (Sandbox Code Playgroud)

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