4

ajax 呼び出しを行う JS 関数 (「サンプル」という名前) を含む gsp ページがあります。

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)
        }
    }
}

問題は、コントロールが controller-action で withFormat->json を決して通過しないことです。そのため、期待される結果が表示されません (コントロールが gsp ページに戻ったとき、「完了」を通過しますが、エラーは記録されていません.誰かが私の ajax 呼び出しに問題を見つけることができますか?詳細な情報を提供する必要がある場合はお知らせください.事前に感謝します.

4

4 に答える 4

4

問題は解決したように見えますが、この背後にある実際の理由について言及したいと思います。

問題は、grails がコンテンツ ネゴシエーションを行う方法にあるようです。

grails docs によると、grails は accept ヘッダーを探し、それが応答形式を決定します。

しかし、ここで問題になるのは、config.groovy ではデフォルトで grails.mime.use.accept.header = false であり、これは基本的に accept ヘッダーを無視するため、ajax リクエストで dataType:"json" を設定しているにもかかわらず(これにより、accept ヘッダーが「application/json」に設定されます)、accept ヘッダーは検索されず、応答形式は常にデフォルトの「all」になります。

したがって、基本的に grails.mime.use.accept.header = true を設定すると、問題が修正されます。

お役に立てれば

于 2013-03-11T11:10:31.020 に答える
3

これは通常、特に Grails 1.x から Grails 2.x に移行するときに人々を惹きつけるものです。ドコをよく読む必要があります。

太字の強調は私のものです...

注意すべきもう 1 つの重要な要素は、withFormat メソッドが処理するのは応答形式であり、要求形式ではないということです。Grails 2.0 では、リクエストの CONTENT_TYPE ヘッダーによって指示されるリクエスト形式を処理するために使用できる、リクエストで使用できる別の withFormat メソッドがあります。

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

デフォルトでは、Grails はブラウザーの Accept ヘッダーを無視します。コンテンツ ネゴシエーションを読む

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

この特定の Accept ヘッダーは、ユーザーが実際に HTML を期待しているのに対し、XML が推奨される応答形式であることを示しているため、役に立ちません。そのため、Grails はブラウザーのデフォルトで Accept ヘッダーを無視します。

grails.mime.disable.accept.header.userAgents は、grails が無視するヘッダーを受け入れるブラウザーを制御します

于 2015-07-16T14:19:30.540 に答える