我有一个登录路由,应该将其输入参数作为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参数?
答案 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)
}