2013-06-04 2 views
3

Я пытаюсь добавить пользовательский заголовок HTTP для ответа определенного набора контроллеров с использованием Grails фильтров:Добавление пользовательских заголовков ответа после того, как «делают, как JSON»

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

Если контроллер делает вид или текст, заголовок добавляется в ответ. Если контроллер использует «render as JSON», заголовок не добавляется. Похоже, конвертер JSON закрывает выходной поток и отправляет его сразу. Это правильно?

Я мог бы использовать перехватчики Grails, но мне пришлось бы повторить его в нескольких контроллерах. Любые идеи о том, как я могу это достичь?

+0

Вы можете динамически добавлять afterInterceptor всем контроллеры при запуске (Bootstrap.groovy). –

+0

Это может сработать. Я думаю, что также имеет базовый контроллер с перехватчиком и простирается от него. Благодарю. – chozero

ответ

4

Вы можете сделать перевод от модели к 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 
      } 
     } 
    } 
} 
Смежные вопросы