【问题标题】:Using POST routes parameters in Play Framework在 Play Framework 中使用 POST 路由参数
【发布时间】:2013-12-11 20:11:36
【问题描述】:

我有一个登录路由,应该将其输入参数作为 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 参数,但也没有说它不起作用。

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

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

【问题讨论】:

  • 我刚刚注意到这一点:If the action method defines some parameters, all these parameter values will be searched for in the request URI, either extracted from the URI path itself, or from the query string 所以我猜它确实不适用于 POST 参数。

标签: playframework playframework-2.2


【解决方案1】:

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

这意味着,您正试图通过... GET params... 发送 POST 请求... 意义何在?

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

【讨论】:

  • 谢谢,日志文件是 GET 参数不可接受的原因之一。所以就像我怀疑的那样,自动参数绑定只适用于 GET 参数,太糟糕了。
  • 如果你使用更高级的表单,那就不是那么戏剧化的方法,只是多几行。使用预定义的约束,您将额外增加安全性,您可以检查用户名是否有要求的长度或者是否是电子邮件等;)竖起大拇指!
  • 在路由时,Play还没有消费请求体,所以还没有解析提交的表单。 - 而且您也不希望它这样做,因为您的操作决定了请求正文如何/是否被解析、流式传输、发送到其他地方,如果 Play 在路由时执行此操作,它将限制您在操作中可以执行的操作。
  • @biesior 但示例 somme javascript UI 仅提供 1 个 url 端点并强制开发人员使用 POST,因此执行某些任务需要从 POST 请求中获取值,然后决定路由到哪个控制器。真实例子Extjs Direct
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
相关资源
最近更新 更多