Grails 1.1 内容协商 - 内容协商使用Accept报头

每个进入的HTTP请求都有个指定的Accept 报头,它定义了什么样的媒体类型(或 mime类型)客户端能"接受"。

在老式浏览器中通常是 :*/*这意味着任何事物.不过在新生浏览器中,所有东西一起像这样发送更有用(一个FirefoxAccept报头示例) :text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5Grails解析这个进入的格式,并添加一个property给request对象,用于描叙首选的请求格式。

对于上述示例下列的断言会通过 :assert 'html' == request.format为什么?这个text/html媒体类型拥有最高"质量"等级0.9,因此,具有最高优先权。

如前所述,假如你有一老式浏览器结果会稍微不同 :assert 'all' == request.format在这种情况下,'all’可能的格式会被客户端接受。

为了处理来自控制器(Controllers)不同类型的请求,你可以使用withFormat方法,它的行为被当作switch表达式 :import grails.converters.* class BookController { def books def list = { this.books = Book.list() withFormat { html bookList:books js { render "alert('hello')" } xml { render books as XML } } } }当Grails只执行 html()调用并且首选的格式是html时会发生什么。

它只是让 Grails寻找每个名为grails-app/views/books/list.html.gsp 或grails-app/views/books/list.gsp的视图。

如果格式是xml,那么,闭包会被调用,XML响应会被渲染 .

我们怎样处理’all’格式?只需在withFormat代码块中简单指定content-types,以便,无论你想要的哪个都会被首先执行。

因此,在上面示例中的"all" 将触发html处理 .

当使用withFormat时确保它在控制器(controller)操作(action)中最后一个被调用,因为withFormat方法的返回值用来决定操作(action)下一步做什么.