6

我有一个控制器,在?request 正文中需要一些 json?并用它做了很棒的事情:

def myController(){
  def myAction(){
    println "Here is request.JSON: ${request.JSON as JSON}"
    println "Here is params: $params"
    //do awesome stuff with request.JSON only
    return
  }
}

所以我可以像这样用 cURL 打这个:

curl -i -H "content-type: application/json" -d "{\"someVariable\":\"Absolutely\"}"

我的 grails 控制器打印:

Here is request.JSON: {"someVariable":"Absolutely"}
Here is params: [controller:'myController', action:'myAction']

到目前为止一切都很好,但是当我尝试使用 jQuery 执行此操作时,它会进入 params !!!

阅读了这两个问题: Setting the POST-body to a JSON object with jQuery

jQuery 在请求正文中发布有效的 json

我对如何编写 .js 的最佳猜测是:

var sendMe = {"someVariable":"Absolutely"}
$.ajax({
  url: '/myController/myAction',
  type: 'POST',
  processData: false,
  data: JSON.stringify(sendMe),
  dataType: 'json',
  success: function(data) {

  },
  error: function(request, status, error) {

  }                     
});

但是当我这样做时,我的控制器会打印:

Here is request.JSON: {}
Here is params: [{"someVariable":"Absolutely"}:, controller:'myController', action:'myAction']

我一定在 jQuery 上做错了什么。

更新:看起来这个白痴实际上遇到了同样的问题:How to get at JSON in grails 2.0但他没有面对 jQuery 问题,而是使用了 cURL 和 reqeust.JSON 的东西。真是个懒惰的家伙。

4

2 回答 2

9

前几天我也遇到了和你一样的问题。

对我来说 - 解决方案是用来jQuery.ajaxSetup设置 ajax 内容类型的默认值。

$(function() {
    $.ajaxSetup({
        contentType: "application/json; charset=utf-8"
    });
}

有了这个,您可以使用$.ajax$.post将您的 JSON 传输到控制器并像这样使用它:

def yourJSON = request.JSON

我不知道为什么里面的 'contentType' 选项在我的测试$.ajax$.post被忽略了。

于 2012-09-06T20:29:16.103 回答
4

也有类似的问题但不需要使用ajaxSetup,只需要设置contentType:

$.ajax({
  method: "POST",
  url: "/api/bar"
  data: JSON.stringify({a:true}),
  contentType:"application/json; charset=utf-8",
  dataType: "json",
  success: function(){
    console.log("args: %o", arguments);
  }
});
于 2013-06-11T15:51:02.507 回答