在“呈现为 JSON”之后添加自定义标头以响应

Posted

技术标签:

【中文标题】在“呈现为 JSON”之后添加自定义标头以响应【英文标题】:Add custom headers to response after "render as JSON" 【发布时间】:2013-05-31 00:36:40 【问题描述】:

我正在尝试使用 Grails 过滤器将自定义 HTTP 标头添加到一组控制器的响应中:

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

如果控制器呈现视图或文本,则标头会添加到响应中。 如果控制器使用“呈现为 JSON”,则不添加标头。看起来 JSON 转换器正在关闭输出流并立即发送。对吗?

我可以使用 Grails 拦截器,但我必须在多个控制器中复制它。 关于如何实现这一目标的任何想法?

【问题讨论】:

您可以在启动时将 afterInterceptor 动态添加到所有控制器 (Bootstrap.groovy)。 这可行。我认为还有一个带有拦截器的基本控制器并从中扩展。谢谢。 【参考方案1】:

您可以在过滤器中进行从模型到 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
            
        
    

【讨论】:

以上是关于在“呈现为 JSON”之后添加自定义标头以响应的主要内容,如果未能解决你的问题,请参考以下文章

SharePoint 2019 - 添加自定义响应标头不起作用

自定义响应头 AngularJS 的访问控制公开头配置

如何将自定义响应标头添加到来自 azure blob 的响应?

在超集中构建自定义马条形图并添加自定义项以自定义图表

WCF 作为 Windows 服务托管 - 自定义 HTTP 标头未反映在响应标头上

在响应中的每个获取请求之前附加自定义标头