Ajax调用不通过GRAILS控制器上的withFormat-> json

时间:2012-11-15 19:51:05

标签: jquery grails

我有一个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-&gt; json,因此我没有看到预期的结果。(当控件返回到gsp页面时,它会通过“完成“但不是通过”成功“。没有记录错误。任何人都可以看到我的ajax电话有任何问题吗?如果我需要提供更多信息,请告诉我。请提前谢谢。

3 个答案:

答案 0 :(得分:4)

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

问题似乎与grails进行内容协商的方式有关。

根据grails docs,grails将查找accept标头,这将决定响应格式。

但是默认情况下,这里的catch是config.groovy,grails.mime.use.accept.header = false,它基本上忽略了accept标头,所以即使你在设置dataType:“json” ajax请求(它会将接受标头设置为“application / json”),它不会查找接受标头,响应格式将始终为“all”,这是默认值。

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

希望这有帮助

答案 1 :(得分:3)

这通常会让人们感到兴奋,特别是从Grails 1.x转移到Grails 2.x时。您必须仔细阅读docco

大胆的重点是我的......

  

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

request.withFormat {
    xml { .. }
    html { .. }
}

答案 2 :(得分:0)

另一种可能的解决方案。

医生说:

  

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

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

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

*/*表示全部接受,这意味着无论其他处理程序如何,都将使用第一个处理程序。

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