我有一个登录路由,应将其输入参数作为 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)
}
}
当我使用 Chrome 测试这条路线时高级 REST 客户端 https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo它仅适用于 GET 参数,如果我将其发送为application/x-www-form-urlencoded
POST 表单数据。
The Play 框架文档 http://www.playframework.com/documentation/2.2.x/ScalaRouting实际上从未提及 POST 参数,但也没有说它不起作用。
我认为如果我创建一个表单并将我的请求绑定到该表单,它可能会起作用,但这似乎不必要地复杂。
难道真的没有办法使用routes文件绑定POST参数吗?
路由 = 解析 URL 内的参数 = 通过 GET 发送参数。
这意味着,您正在尝试通过... GET params... 发送 POST 请求,这有什么意义?
詹姆斯·罗珀解释说:
在路由时,Play 尚未消耗请求正文,因此尚未解析提交的表单。 - 你也不希望它这样做,因为你的操作决定了请求正文如何/是否被解析、流式传输、发送到其他地方,如果 Play 在路由时执行此操作,它将限制你在操作中可以执行的操作。
从安全角度来看,将凭据保留在客户端路径中每台计算机的日志中绝对是个坏主意。
相反,您应该使用常见的表单处理方式来完成此操作,如中所述基本表格文档 http://www.playframework.com/documentation/2.2.x/ScalaForms:
route:
POST /v1/accounts/login controllers.v1.Accounts.login
action:
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)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)