4

我有一个 gsp 页面,其中包含一个执行 ajax 调用的 JS 函数(名为“sample”)。

function sample() {
         var params = { office: {id: "testId"}, population: {id: "testId2"}};

        $.ajax({
            url: "http://localhost:8080/officeProj/mustache/list",
            cache: false,
            contentType: "application/json; charset=utf-8",
            type: "POST",
            dataType: "json",
            data: JSON.stringify(params),
            complete:function(json){
                console.log(" reponse :"+ json);
            },
            success: function(officeData) {
                var template = "<h1>{{data.firstName}} {{data.lastName}}</h1>";
                var html = Mustache.to_html(template, data);
                $('#sampleArea').html(html);
            } ,
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                console.log("error :"+XMLHttpRequest.responseText);
            }
        })

    }

现在,这个 ajax 调用到达适当的 GRAILS 控制器和适当的操作,定义为:

def list = {

    withFormat {
        html { return [title: "Mustache" , data:[firstName:"Indiana", lastName:"Jones"], address:"NYC" ] }
        json {
            // extract the data to be rendered to the page
            println("processing JSON.....")
            render ([title: "Mustache" , data:[firstName:"Indiana", lastName:"Jones"], address:"NYC" ] as JSON)
        }
    }
}

问题是控件从不通过控制器操作中的 withFormat->json ,因此我没有看到预期的结果。(当控件返回 gsp 页面时,它通过“完整”但不是通过“成功”。没有记录错误。任何人都可以看到我的ajax调用有什么问题吗?如果我需要提供更多信息,请告诉我。提前致谢。

4

4 回答 4

4

即使您的问题似乎已经解决,我还是想提一下这背后的实际原因。

问题似乎出在 grails 进行内容协商的方式上。

根据 grails 文档,grails 将寻找接受标头,这将决定响应格式。

但是这里的问题是,默认情况下,在 config.groovy 中,grails.mime.use.accept.header = false,它基本上忽略了接受标头,因此即使您在 ajax 请求中设置了 dataType:"json"(这反过来会将接受标头设置为“application/json”),它不会寻找接受标头并且响应格式将始终为“全部”,这是默认值。

所以基本上设置 grails.mime.use.accept.header = true,将解决这个问题。

希望这可以帮助

于 2013-03-11T11:10:31.020 回答
3

这通常会引起人们的注意,尤其是在从 Grails 1.x 迁移到 Grails 2.x 时。你必须仔细阅读docco

粗体字的重点是我的...

另一个需要注意的重要因素是 withFormat 方法处理的是响应格式而不是请求格式。从 Grails 2.0 开始,请求提供了一个单独的 withFormat 方法,您可以使用它来处理由请求的 CONTENT_TYPE 标头指定的请求格式:

request.withFormat {
    xml { .. }
    html { .. }
}
于 2012-11-15T21:20:45.987 回答
0

另一个潜在的解决方案。

医生说:

请注意,如果请求格式为“全部”或多个内容类型在接受标头中具有相同的“q”等级,则类型的顺序很重要。在前一种情况下,块中的第一个类型处理程序被执行

我认为这意味着如果您的 Accept 标头如下所示:

Accept:application/json, text/javascript, */*; q=0.01

*/*表示接受所有,这意味着将使用第一个处理程序,而不管其余的。

快速解决方案:将 html {} 闭包移至最后。

于 2014-05-07T19:17:14.223 回答
0

Grails 默认忽略浏览器的接受标头。阅读内容协商

text/xml, application/xml, application/xhtml+xml, text/html;q=0.9, text/plain;q=0.8, image/png, / ;q=0.5

这个特殊的接受头是无用的,因为它表明 XML 是首选的响应格式,而用户真正期望的是 HTML。这就是为什么 Grails 默认忽略浏览器的接受标头的原因。

grails.mime.disable.accept.header.userAgents 控制哪些浏览器接受标题 grails 将忽略

于 2015-07-16T14:19:30.540 回答