Grails不会为json添加标头

时间:2013-11-18 17:38:41

标签: json grails curl

我正在尝试使用测试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有效!是否可能扩展{{ 3}}绕过标准过滤器?

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

上创建一个错误报告

EDIT3:打开RestfulController,当我知道更多时,我会更新此任务

EDIT4:根据JIRA case,它似乎是一个错误,它将在grails 2.3.4上更正

1 个答案:

答案 0 :(得分: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()]
}

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