Официальная документация Grails гласит, что
Версия 2.0.x плагина для лесов включает в себя различные строительные леса шаблоны, совпадающие с новыми API REST, встроенными в Grails 2.3 и выше. (взято отсюда http://grails.org/doc/latest/guide/scaffolding.html)
Но я не могу сделать (или я не понимаю концепцию) работу RESTfulness вместе с лесами.
Начните с нуля:
grails create-app myapp
cd myapp/
grails create-domain-class Book
grails create-scaffold-controller myapp.Book
Добавить поле в класс домена
class Book {
String text
static constraints = {
}
}
и запустите приложение с помощью grails run-app
.
Серфинг на http://localhost:8080/myapp/
показывает, что строительные леса отлично работают:
-
http://localhost:8080/myapp/book/index
страница показывает список книг -
http://localhost:8080/myapp/book/show/1
страница показывает подробности для книги с id = 1 -
http://localhost:8080/myapp/book/create
страница создает книгу - и, следовательно, силы, старые добрые леса.
Посмотрим, что будет с REST.
Официальные документы говорят, что я должен использовать URL-адреса, такие как http://localhost:8080/myapp/books/...
для REST, но любые попытки доступа к приложению, вроде этого curl -i -H "Accept: application/json" localhost:8080/myapp/books/1
возвращает 404 с кучей HTML.
Хорошо, внимательно прочитайте документы:
Самый простой способ создать RESTful API в Grails - выставить класс домена как ресурс REST. Это можно сделать, добавив grails.rest.Resource преобразование в любой класс домена
Нет проблем, теперь заголовок класса книги
import grails.rest.*
@Resource(uri='/books') class Book {
Теперь серфинг на http://localhost:8080/myapp/
показывает, что строительные леса разбиты:
-
http://localhost:8080/myapp/book/index
страница показывает список книг -
http://localhost:8080/myapp/book/create
отображается страница xml<?xml version="1.0" encoding="UTF-8"?><book><text /></book>
- и так сильно, плохой новый xml-вывод.
Я играл с @Resource и "/books" (ресурсы: "книга" ) в URLMappings.groovy, но не нашел никакого рабочего решения, которое делает возможными строительные леса, а RESTfulness работает спина к спине. Действительно, мне удалось заставить их работать отдельно.
Обновление
Я нашел способ достижения желаемой цели. Я нашел:
- Отметьте класс книги с помощью
@Resource(uri = "/books")
. - Удалить контроллер леса. BookController.
- Создайте выделенный контроллер с помощью лесов для книги:
class HumanBookController {static scaffold = Book}
Теперь страницы графического интерфейса scaffold с URL-адресами, такими как http://localhost:8080/myapp/humanBook/index
, работают очень хорошо. Любые запросы json обрабатываются с такими URL-адресами, как http://localhost:8080/myapp/books/1
. Но не изящно иметь 2 контроллера, которые делают одинаковые вещи для обычных веб-сайтов и json.