You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:11:07