看来我明白了。
这里:
https ://groups.google.com/forum/#!topic/play-framework/XH3ulCys_co
在这里:
https ://groups.google.com/forum/#!msg/play-framework/M97vBcvvL58/216pTqm22HcJ
有wrong
和correct
方式解释:
Doesn't work: curl -d "name=sam" http://localhost:9000/test
Works: curl -d "" http://localhost:9000/test?name=sam
这就是 POST 参数传递的方式。在游戏中。(第二个链接是解释为什么):
有时你必须做出妥协。在 Play 1 中,您可以从从 URL 路径、查询字符串甚至请求正文中提取的任何参数中绑定您的操作参数。它非常高效,但您无法控制表单的上传方式。我的意思是,如果用户上传一个大文件,您需要将整个请求加载到内存中才能处理它。
在 Play 2 中,您可以控制请求正文提交。如果用户有问题,您可以尽早拒绝它,您可以处理大文件或流,而无需用多个 HTTP 块填充您的内存……您可以高度控制发生的事情,它可以帮助您扩展服务。但是,硬币的另一面是,当请求被路由时,Play 2 仅使用请求标头来做出决定:请求正文尚不可用,因此无法直接从提取的参数中绑定动作参数请求正文。
更新:
有趣的是:在我让它在我的笔记本电脑上工作之后,然后将它推到 gitHub 上并将它拉到另一台机器上,它开始以不同的方式工作。现在它抱怨Bad Request is [Invalid XML]但是我使用"application/json"
标头并且在提交后没有更改任何代码行。
更新 2
所以我这样修复它:
在角度方面(我们甚至可以评论dataType
和headers
):
var data = $scope.fields
$http({
url: '/forms/FormValidator1/validateForm',
method: "POST",
//dataType: "json",
data: data,
//headers: {'Content-Type': 'application/json'}
}).success(function (data, status, headers, config) {
console.log("good")
}).error(function (data, status, headers, config) {
console.log("something wrong")
});
在 playFramework 方面:(使用BodyParser)
def validateForm = Action { request =>
val body: AnyContent = request.body
val jsonBody: Option[JsValue] = body.asJson
// Expecting text body
jsonBody.map { jsValue =>
val name = (jsValue \ "name")
val surname = (jsValue \ "surname")
....
}
路线(根本不定义参数!):
POST /forms/FormValidator1/validateForm controllers.FormValidator1.validateForm