【问题标题】:Grails doesn't add headers for jsonGrails 不为 json 添加标头
【发布时间】:2013-11-18 17:38:41
【问题描述】:

我正在尝试在测试 grails 应用程序上使用过滤器添加自定义标头。我已经设置了这样的过滤器:

class MyFilters {
    def filters = {
        addHeader(uri: '/*') {
            after = { Map model ->
                response.setHeader('X-Test-Header', '123')
            }
        }
    }
}

如果我尝试访问控制器并检查标题:

curl -I -H "Accept: text/html" -X GET 'http://localhost:8080/Test1/doSomething'

然后,我得到了额外的标题:X-Test-Header: 123 但如果我使用“Accept: application/json”尝试上述 curl,我会得到 JSON 格式的内容,但我没有得到任何额外的标题。

我做错了什么?

我忘了提到我正在试验新的 grails REST 功能并且我的控制器扩展了 RestfulController

编辑:我做了一些额外的实验。我添加了另一个过滤器作为 groovy 类并修改了 web.xml(从this article - grails-add-header-to-every-response 得到了这个想法,它不适用于 application/json 但适用于 text/html!扩展 RestfulController 是否有可能绕过标准过滤器?

EDIT2:添加标头似乎适用于 application/xml 和 text/xml,但不适用于 application/json 和 text/json。我看的越多,它似乎是一个错误,而不是我做错了什么,因为我在全新 VM 上的全新项目上看到完全相同的行为(以防我的开发机器有某种奇怪的配置)。我将在 JIRA 上创建一个错误报告

EDIT3:打开了JIRA case,当我知道更多时,我会更新这个任务

EDIT4:基于JIRA case,它似乎是一个错误,它将在 grails 2.3.4 上得到纠正

【问题讨论】:

    标签: json grails curl


    【解决方案1】:

    打开了JIRA case。看起来“after”操作允许在渲染视图之前修改模型,但响应方法渲染 JSON 并在输出响应后执行“after”操作(因此,修改响应为时已晚)。因此,根据 Graeme Rocher 的说法,一种解决方法是在“之前”块或操作中添加标题,如下所示:

    def index(Integer max) {
        params.max = Math.min(max ?: 10, 100)
        response.setHeader('X-MyHeader', '123')
        respond Person.list(params), model:[personInstanceCount: Person.count()]
    }
    

    因此,这将纠正索引操作的行为

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-02
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      相关资源
      最近更新 更多