0

クエリ文字列のパラメーターを使用してGrails 1.3.7にPOST を送信するという問題がありました。format=json

GrailswithFormatのドキュメント - http://grails.org/doc/1.3.7/ref/Controllers/withFormat.htmlに基づいて、このパラメーターにより、クロージャーが内部でwithFormatクロージャーを実行する必要がありjsonます。

すなわち:

withFormat {
    json {
        // this logic should be executed if the query string has format=json
    }
} 

この場合、コントローラ メソッドは複数のコンテンツ タイプを提供していました。フォームに対してのみ実行する必要があるロジックがいくつかあったため、withFormat次のようにクロージャが追加されました。

withFormat {
    form {
        // form specific logic
    }
}

jsonこれが json リクエストである場合、実行する対応するロジックがなかったため、ブロックがないことに注意してください。format=json問題は、クエリ文字列を送信したリクエストでもフォーム ブロックが実行されていたことです。

なぜこれが起こるのでしょうか?

4

1 に答える 1

4

どうやら withFormat 内で一致するクロージャを指定しなくても、Grails はいずれにせよクロージャを実行します。Grails のドキュメントには、リクエスト形式が「all」の場合、withFormat ブロック内の最初のクロージャが実行されることが記載されています。withFormat ブロック内のクロージャーのいずれにも一致しないリクエスト形式がある場合、Grails はデフォルトで最初のクロージャーを実行すると思います。

これを修正するために、withFormat 内に空の json クロージャーを配置し、Grails はそれ以降すべてを期待どおりに処理しました。

withFormat {
    json {
        // do nothing
    }
    form {
        // form specific logic
    }
}
于 2012-06-22T18:52:51.600 に答える