【问题标题】:Playframework handling post requestPlayframework 处理 post 请求
【发布时间】:2013-11-12 23:04:08
【问题描述】:

在我的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: "我”,姓:“我的”}

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

更新:

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

【问题讨论】:

  • 这里没什么可做的;你能完整地向我们展示 400 Bad Request 响应吗?那里经常有线索。

标签: json playframework


【解决方案1】:

我好像明白了。

这里: 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 参数传递的方式。在游戏中。 (第二个链接是解释 WHY):

有时您必须做出妥协。在 Play 1 中,您可以绑定您的 从 URL 路径中提取的任何参数的操作参数, 查询字符串甚至请求正文。它的生产力很高,但 您无法控制表单的上传方式。我的意思是,如果一个 用户上传一个大文件,您需要在其中加载整个请求 内存能够处理它。

在 Play 2 中,您可以控制请求正文的提交。你可以拒绝 如果用户有问题,你可以尽早处理 文件或流,而无需使用多个 HTTP 填充您的内存 块……您可以高度控制所发生的事情,它可以帮助您 扩展您的服务。但是,硬币的另一面是,当 请求被路由,Play 2 只使用请求头来使其 决定:请求正文尚不可用,因此无法 从提取的参数中直接绑定动作参数 请求正文。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 2012-10-08
  • 2014-05-05
  • 1970-01-01
相关资源
最近更新 更多