我好像明白了。
这里:
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 参数传递的方式。在游戏中。 (第二个链接是解释 WHY):
有时您必须做出妥协。在 Play 1 中,您可以绑定您的
从 URL 路径中提取的任何参数的操作参数,
查询字符串甚至请求正文。它的生产力很高,但
您无法控制表单的上传方式。我的意思是,如果一个
用户上传一个大文件,您需要在其中加载整个请求
内存能够处理它。
在 Play 2 中,您可以控制请求正文的提交。你可以拒绝
如果用户有问题,你可以尽早处理
文件或流,而无需使用多个 HTTP 填充您的内存
块……您可以高度控制所发生的事情,它可以帮助您
扩展您的服务。但是,硬币的另一面是,当
请求被路由,Play 2 只使用请求头来使其
决定:请求正文尚不可用,因此无法
从提取的参数中直接绑定动作参数
请求正文。
更新:
有趣的是:在我让它在我的笔记本电脑上工作之后,然后将它推到 gitHub 上并将它拉到另一台机器上,它开始以不同的方式工作。现在它抱怨 Bad Request 是 [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