快速业务通道

精通Grails: RESTful Grails - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
port/list,并验证 Accept 报头正在请求 text/xml 。这就是资源的 MIME 类型了。

那么,Grails 是如何响应服务器端的 Accept 报头的呢?再向 AirportController 添加一个闭包, 如清单 4 所示:

清单 4. debugAccept 操作

def debugAccept = {   def clientRequest = request.getHeader("accept")   def serverResponse = request.format   render "Client: ${clientRequest}\nServer: ${serverResponse}\n" }

清单 4 中的第一行从请求中检索出了 Accept 报头。第二行展示了 Grails 如何转换请求和它将要发 回的响应。

现在,使用 cURL 来做相同的搜索,如清单 5 所示:

清单 5. 调试 cURL 中的 Accept 报头

$ curl  http://localhost:9090/trip/airport/debugAccept Client: */* Server: all $ curl --header Accept:text/xml http://localhost:9090/trip/airport/debugAccept Client: text/xml Server: xml

精通Grails: RESTful Grails(6)

时间:2011-07-29 IBM Scott Davis

all 和 xml 值是哪来的呢?看一下 grails-app/conf/Config.groovy。在文件顶部,您应该看到了一 个散列映射,它对所有的键都使用了简单名称(像 all 和 xml 这样的名称),而且所有的值都使用了与 之对应的 MIME 类型。清单 6 展示了 grails.mime.types 散列映射:

清单 6. Config.groovy 中的 grails.mime.types 散列

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

典型的 Web 浏览器提供的 Accept 报头要比您与 cURL 一起使用的稍微复杂些。例如,Mac OS X 10.5.4 上的 Firefox 3.0.1 提供的 Accept 报头大致是这样的:

text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

它是一个用逗号隔开的列表,它带有可选的 q 属性,用以支持 MIME 类型(q 值 — quality 的缩写 — 是 float 值,范围是 0.0 到 1.0)。由于 application/xml 被赋予了一个为 0.9 的 q 值,所以与 其他类型的数据相比,Firefox 更偏好 XML 数据。

下面是 Mac OS X 10.5.4 上的 Safari 3.1.2 版本提供的 accept 报头:

text/xml,application/xml,application/xhtml+xml,     text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

text/html MIME 类型被赋予了一个为 0.9 的 q 值,所以首选的输出类型是 HTML,0.8 时为 text/plain,0.5 时为 */*。

那么,现在您应该对内容协商有了更多的了解了,您可以将 withFormat 块添加到 list 操作,以此 来依据请求中的 Accept 报头返回合适的数据类型,如清单 7 所示:

清单 7. 在一个操作中使用 withFormat 块

def list = {   if(!params.max) params.max = 10   def list = Airport.list(params)   withFormat{    html{     return [airportList:list]    }    xml{     render list as XML

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号