Playframework 在Play框架中使用POST routes参数

Playframework 在Play框架中使用POST routes参数,playframework,playframework-2.2,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

我有一个登录路径,应该将其输入参数作为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)
  }
}
我的控制器是这样的:

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测试此路由时,它仅适用于GET参数,而不是作为
application/x-www-form-urlencoded
POST form data发送

实际上,它从未提到POST参数,但也没有说它不起作用

我认为,如果我创建一个表单并将我的请求绑定到该表单,它可能会工作,但这似乎不必要地复杂


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

Route=解析URL内的参数=通过GET发送参数

这意味着,您正试图通过以下方式发送POST请求。。。获取参数。。。感觉如何

詹姆斯·罗珀解释说:


在路由时,Play尚未使用请求正文,因此尚未解析提交的表单。-您也不希望它这样做,因为是您的操作决定请求主体如何/是否被解析、流式传输或发送到其他地方,如果Play在路由时这样做,则会限制您在操作中所能做的

从安全性的角度来看,在客户端路径中的每台机器的日志中留下凭据肯定是个坏主意

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

路线:

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)
}

我刚刚注意到:
如果action方法定义了一些参数,那么所有这些参数值都将在请求URI中搜索,要么从URI路径本身提取,要么从查询字符串提取,因此我猜它确实不适用于POST参数。谢谢,日志文件是GET参数不可接受的原因之一。所以,正如我所怀疑的那样,自动参数绑定只适用于GET参数,这太糟糕了。这并不是一种引人注目的方法,如果您使用更高级的表单ie,只需再增加几行即可。通过预定义的约束,您将额外增加安全性,您只需检查用户名是否具有所需的长度,或者是否是电子邮件等;)竖起大拇指!在路由时,Play尚未使用请求正文,因此尚未解析提交的表单。-您也不希望这样做,因为是您的操作决定了请求主体如何/是否被解析、流式传输或发送到其他地方,如果Play在路由时这样做,则会限制您在操作中所能做的。@biesior但示例somme javascript UI只提供了1个url端点,并强制开发人员使用POST,所以,要执行某些任务,需要从POST请求中获取值,然后决定到哪个控制器的路由。实例