Недавно я сделал именно это с приложением 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
.
Вам также может понадобиться обновить файл Config.groovy, где он работает с типами mime.Вот что у меня есть:
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).
Я обнаружил, что для правильной обработки JSON в методе update()
, class
атрибут должен присутствовать и корректно входящий объект JSON.Поскольку библиотека, которую я использовал в своем клиентском приложении, не облегчала эту проблему, я переключился на использование XML.