在我的routes
:
POST /forms/FormValidator1/validateForm controllers.FormValidator1.validateForm(jsonForm:String)
为该路线定义了一个控制器方法:
def validateForm(jsonForm:String) = Action { ...
然后我尝试通过chrome POSTMAN插件发送POST请求(见上图)。
我用:
网址:
http://localhost:9000/forms/FormValidator1/validateForm
标题:内容类型:application / json
json数据: {name:“me”,姓:“my”}
因此,发送此POST请求我无法通过提到的路由/网址达到控制器的方法。的为什么吗
更新:
有趣的是:在我的笔记本电脑上工作之后(请参阅下面的答案)然后将它推到gitHub并将其拉到另一台机器上,它开始以不同的方式工作。现在它抱怨错误请求是[无效的XML]然而我使用"application/json"
标头并且在提交后没有更改任何代码行。我想知道这可能是 bug 。
答案 0 :(得分:3)
好像我明白了。
下面: 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填充内存的文件或流 大块...你可以很好地控制发生的事情,它可以帮助你 扩展您的服务。但是,硬币的另一面是当a 请求被路由,Play 2仅使用请求标头来进行 决定:请求正文尚未提供,因此无法解决 从提取的参数直接绑定动作参数 请求机构。
<强>更新强>
有趣的是:在我的笔记本电脑上工作之后,然后将它推到gitHub并将其拉到另一台机器上,它开始以不同的方式工作。现在它抱怨错误请求 [无效的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