我最近在一个 Grails 应用程序中做到了这一点,发现获取生成的控制器并让它们根据内容协商从视图中输出 JSON 或 XML 或 HTML 非常容易。
Grails 手册中要查看的地方是内容协商部分,如果您需要处理 JSON 或 XML 输入,还需要编组。
要获得 JSON 和 XML 输出,在默认的 list() 方法中,将其更改为这个(我有一个 Session 对象,在这种情况下......我的域类之一):
def list() {
params.max = Math.min(params.max ? params.int('max') : 10, 100)
def response = [sessionInstanceList: Session.list(params), sessionInstanceTotal: Session.count()]
withFormat {
html response
json {render response as JSON}
xml {render response as XML}
}
}
在默认情况下只返回一个对象的任何地方,您都需要将返回的值替换为 withFormat 块。
您可能还需要更新处理 mime 类型的 Config.groovy 文件。这是我所拥有的:
grails.mime.file.extensions = true // enables the parsing of file extensions from URLs into the request format
grails.mime.use.accept.header = true
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'
]
作为输入(例如,update() 或 save() 操作)JSON 和 XML 有效负载将自动解组,并将像表单输入一样绑定,但我发现解组过程是有点挑剔(尤其是 JSON)。
我发现,为了在 update() 方法中正确处理 JSON,class 属性必须在入站 JSON 对象上存在且正确。由于我在客户端应用程序中使用的库并不容易处理这个问题,因此我转而使用 XML。