4

Grails Filters を使用して、特定の一連のコントローラーの応答にカスタム HTTP ヘッダーを追加しようとしています。

class ApiFilters {
   def filters = {
      xwingFilter(uri:'/api/**') {
         after = {
            response.setHeader('X-Wing', 'foo')
         }
      }
   }
}

コントローラーがビューまたはテキストをレンダリングする場合、ヘッダーが応答に追加されます。コントローラーが「JSON としてレンダリング」を使用する場合、ヘッダーは追加されません。JSON コンバーターが出力ストリームを閉じて、すぐに送信しているようです。そうですか?

Grails インターセプターを使用することもできましたが、複数のコントローラーで複製する必要がありました。どうすればこれを達成できるかについてのアイデアはありますか?

4

1 に答える 1

5

アクションの代わりにフィルターでモデルから JSON への変換を行うことができます。

コントローラ:

class myController {
    def myAction() {
        [aThing: 1, anotherThing: [a: 1, b: 2]]
    }
}

フィルター:

class ApiFilters {
    def filters = {
        xwingFilter(uri:'/api/**') {
            after = { model ->
                response.setHeader('X-Wing', 'foo')
                render model as JSON
                return false // prevent normal view from rendering
            }
        }
    }
}
于 2013-06-04T15:05:19.013 に答える