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)