5

在我的routes

POST        /forms/FormValidator1/validateForm                       controllers.FormValidator1.validateForm(jsonForm:String)

为该路由定义了一个控制器方法:

def validateForm(jsonForm:String) = Action { ...

然后我尝试通过 chrome POSTMAN 插件发送 POST 请求(见上图)。

我用:

url: http://localhost:9000/forms/FormValidator1/validateForm
headers:内容类型: application/json
json 数据: {name: "me", surname: "my"}

所以,发送这个 POST 请求我无法通过提到的路由/url 到达控制器的方法。为什么?

更新:

有趣的是:在我让它在我的笔记本电脑上工作之后(见下面我的答案)然后把它推到 gitHub 上并将它拉到另一台机器上,它开始以不同的方式工作。现在它抱怨Bad Request is [Invalid XML] 但是我使用"application/json"标头并且在提交后没有更改任何代码行。我想知道这可能是一个错误

在此处输入图像描述

4

1 回答 1

3

看来我明白了。

这里: https ://groups.google.com/forum/#!topic/play-framework/XH3ulCys_co

在这里: https ://groups.google.com/forum/#!msg/play-framework/M97vBcvvL58/216pTqm22HcJ

wrongcorrect方式解释:

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

所以我这样修复它:

在角度方面(我们甚至可以评论dataTypeheaders):

  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
于 2013-11-13T02:32:48.777 回答