AJAX 将 JSON 数据从 Javascript 发布到 Grails

Posted

技术标签:

【中文标题】AJAX 将 JSON 数据从 Javascript 发布到 Grails【英文标题】:AJAX post JSON data from Javascript to Grails 【发布时间】:2011-06-02 07:50:34 【问题描述】:

我正在尝试将 JSON 格式的数据从 javascript(使用 Prototype)发布到 Grails。我的 Javascript 代码是:

var JSONObject = new Object;
    JSONObject.id = "23";
    JSONObject.name = "Test 1";
    JSONstring = JSON.stringify(JSONObject);



 var url = "$createLink(controller:'testController', action:'receiveJson')";
    new Ajax.Request(url, 
      method:'post',
      contentType:'application/json',
      parameters:JSONstring,
      asynchronous:true,
      onSuccess: function (req) 
        sendInfoResponse(req.responseText);
      
    );

我的 Grails 控制器中的代码是:

def receiveJson = 
  def json = request.JSON;

但是,在我的测试中,“json”变量似乎为空。如果有人能解释我做错了什么,我将不胜感激。非常感谢。

【问题讨论】:

您是指应用程序的手动测试还是适当的单元/集成测试? 【参考方案1】:

在你的 Ajax.Request 选项中改变

parameters:JSONstring,

postBody:JSONstring,

使用参数的问题在于它对数据进行 URL 编码,因此请求正文最终看起来像这样:

%7B%22id%22%3A%2223%22%2C%22name%22%3A%22Test%201%22%7D&_=

而不是想要的(这是你用 postBody 得到的):

"id":"23","name":"Test 1"

【讨论】:

或者您可以使用parameters:JSONObject, 并完全省略JSONstring,Prototype 会为您正确编码。 @clockworkgeek 将对象编码为键/值对:id=23&name=Test%201&_=。您可以在控制器中以 params.id 和 params.name 的形式访问它,但它不会通过 request.JSON 被解析为 JSON 对象,这是我认为原始发布者想要的。【参考方案2】:

好问题 mfloryan - 我是手动进行测试的,即不是作为单元或集成测试的一部分。

非常感谢您的帮助hvgotcodes。我按照您的建议对代码进行了更改,但不幸的是无济于事。有趣的是,如果我打印 request.JSON 我会得到,而如果我打印 request.json 我会得到null

编辑:“打印”是指使用:request.JSON.toString()

编辑:非常感谢大家的帮助。一旦我进行了最后的更改,John Wagenleitne 建议代码开始正常工作。我真的非常感谢您的帮助。

【讨论】:

如果您引用的答案解决了问题,那么您应该将答案标记为已接受。【参考方案3】:

我认为您没有正确调用 Ajax.Request。从文档中,参数选项:

“请求的参数,将被编码到一个'get'方法的URL中,或编码到其他方法的请求正文中。这可以作为URL编码的字符串或任何Hash-兼容的对象(基本上是任何东西),具有表示参数的属性。”

我认为你需要做类似的事情

...
parameters: json: JSONString
...

然后在你的控制器中

request.json

注意参数对象字面量的形式——它告诉 Prototype 库使请求键为“json”,请求值为 json 字符串。您可以访问控制器中请求对象的密钥。

编辑——我刚刚意识到你的 javascript 块被抬高了。

这个:

var JSONObject = new Object;

应该是这样的

var JSONObject = new Object();
...

你也可以只做一个对象字面量,所以

var jsonObject = ;
....

【讨论】:

以上是关于AJAX 将 JSON 数据从 Javascript 发布到 Grails的主要内容,如果未能解决你的问题,请参考以下文章

PHP 脚本如何向 Dojo 的 xhrGet 发送 JSON Ajax 响应?

AJAX 将 JSON 数据从 Javascript 发布到 Grails

将 HTML 数据从表单发送到 JSON 文件 (Ajax/Jquery)

如何使用 Ajax 将 Summernote 文本从 JSON 数据转换为纯文本?

JavaScrip t对象和 JSON 数据格式转换

Ajax(从json中提取数据)