Playframework处理发布请求

时间:2013-11-12 23:04:09

标签: json playframework

在我的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

enter image description here

1 个答案:

答案 0 :(得分: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填充内存的文件或流   大块...你可以很好地控制发生的事情,它可以帮助你   扩展您的服务。但是,硬币的另一面是当a   请求被路由,Play 2仅使用请求标头来进行   决定:请求正文尚未提供,因此无法解决   从提取的参数直接绑定动作参数   请求机构。

<强>更新  有趣的是:在我的笔记本电脑上工作之后,然后将它推到gitHub并将其拉到另一台机器上,它开始以不同的方式工作。现在它抱怨错误请求 [无效的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