Grails:request.JSON来自哪里,我如何用jQuery的.ajax()或.post()来处理它?

我有一个控制器,在请求体中需要一些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 !!!

阅读了这两个问题: 使用jQuery将POST主体设置为JSON对象

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做错了。

更新:看起来这个白痴实际上遇到了同样的问题: 如何在grails 2.0中获得JSON,但他没有遇到jQuery问题,而是使用了cURL和reqeust.JSON。 多么懒惰的家伙。

我几天前和你一样有同样的麻烦。

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

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

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

 def yourJSON = request.JSON 

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

有一个类似的问题,但不需要使用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); } });