【问题标题】:withFormat closure is not sending response based on ACCEPT headerwithFormat 闭包不发送基于 ACCEPT 标头的响应
【发布时间】:2013-05-10 14:51:53
【问题描述】:

我正在尝试 grails 中的 withFormat 闭包。我的行动有以下几点:

    if (myInstance.save(flush: true)) {
            withFormat {
                html {redirect(action: "list") }
                js {render "alert('came here')"}
            }

    }

据我了解 withFormat 闭包:如果ACCEPT 标头是text/javascript,那么它只会呈现警报,如果它是['text/html','application/xhtml+xml'],那么它将重定向到list 操作。但是,在我的情况下,它总是呈现 list 动作。

我在 Chrome 中使用 REST 控制台,这里是我的请求标头的详细信息:

Accept: text/javascript
Content-Type: application/json
Connection: keep-alive
Origin: chrome-extension: //rest-console-id
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31

这里是响应头:

Status Code: 200
Date: Fri, 10 May 2013 14:45:18 GMT
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked
Content-Language: en-US
Content-Type: text/html;charset=UTF-8

响应正文总是以 HTML 形式返回,而我期待的是 JS

config.groovy 中的 mime 类型似乎也是正确的

grails.mime.types = [
    all:           '*/*',
    atom:          'application/atom+xml',
    css:           'text/css',
    csv:           'text/csv',
    form:          'application/x-www-form-urlencoded',
    html:          ['text/html','application/xhtml+xml'],
    js:            'text/javascript',
    json:          ['application/json', 'text/json'],
    multipartForm: 'multipart/form-data',
    rss:           'application/rss+xml',
    text:          'text/plain',
    xml:           ['text/xml', 'application/xml']
]

我在这里做错了什么??

经过一些测试,我发现先关闭的优先。如果我有:

        withFormat {
            js {render "alert('came here')"}
            html {redirect(action: "list") }
        }

那么即使我从浏览器测试应用程序,JS 也总是被渲染...

【问题讨论】:

    标签: javascript grails mime-types


    【解决方案1】:

    grails.mime.use.accept.header = true 需要在Config.groovy 中设置。你有这一套吗?

    参考withFormat页面底部。

    【讨论】:

    • 该死!就是这样。现在,当 ACCEPT 标头为 text/javascript 时,响应正文正在呈现警报。但是,响应 content-type 仍然是 `text/html'。这是一个值得关注的问题吗?
    • 这很正常,您可以使用 contentType: 'text/javascript' 属性在渲染中更改您的 contentType
    • 抱歉回复晚了。被拖走吃午饭。 @davydotcom 是正确的。你可以使用render(status: 200, contentType: 'text/javascript', text: "your text here") 之类的东西。另请注意,text/javascript 已过时,您可以使用 application/javascript 实现跨浏览器兼容性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 2013-08-28
    相关资源
    最近更新 更多