如何通过AJAX从Grails控制器获取值到GSP页面?(遇错误)
解决Grails中AJAX调用控制器返回JSON报错的问题
问题根源
你的代码触发error回调的核心原因是:控制器返回的JSON字符串未设置正确的Content-Type响应头,AJAX期望接收application/json类型的数据,但实际收到的是Grails默认的text/html,导致浏览器无法将响应解析为JSON对象,进而触发错误回调。
修复方案
1. 控制器代码优化(二选一)
写法一:利用Grails自动序列化(推荐)
Grails支持直接返回Map并自动序列化为JSON,同时自动设置正确的响应头:
def getNum(){ String num = params.num Long locnum = num as Long int result = storeService.getNum(locnum) // 直接返回Map,Grails会自动转为JSON并设置Content-Type render([count: result] as JSON) }
写法二:手动指定响应类型(若坚持用JsonOutput)
如果一定要手动生成JSON字符串,需要显式设置响应的Content-Type:
def getNum(){ String num = params.num Long locnum = num as Long int result = storeService.getNum(locnum) String json = JsonOutput.toJson([count: result]) // 指定响应类型为JSON render(contentType: "application/json", text: json) }
2. AJAX代码优化(提升调试体验)
完善error回调,打印详细错误信息方便排查;同时在success回调中正确获取返回的数值:
$.ajax({ url:'${createLink(controller: 'store', action: 'getNum')}', type: 'GET', dataType: 'json', data: {num: num}, // num已提前定义且可正常访问 error: function(xhr, status, error) { console.log("请求错误状态:", status); console.log("错误详情:", error); console.log("服务器响应内容:", xhr.responseText); alert("请求失败,请查看浏览器控制台获取详细信息"); }, success: function(data) { // 访问返回的count数值 alert("获取到的数值:" + data.count); // 示例:将数值渲染到页面指定元素 // $("#your-target-element-id").text(data.count); } });
验证方法
修改完成后点击按钮触发AJAX请求:
- 若进入success回调,说明数据已正常获取,可通过
data.count拿到所需数值并渲染到页面 - 若仍报错,打开浏览器开发者工具(F12)的「网络」面板,查看该请求的响应头和响应内容,进一步排查问题
内容的提问来源于stack exchange,提问作者jimmy
相关产品推荐
相关产品推荐

