Вопрос дизайна: как создать restful интерфейс, состоящий из нескольких объектов домена?

#rest #grails #grails-orm

#rest #grails #grails-orm

Вопрос:

Итак, мы начинаем с grails в нашей компании и создаем это приложение, которое использует ExtJS в качестве интерфейса и Grails во внутренней части.

Поскольку ExtJS работает исключительно с JSON для заполнения таблиц данных и тому подобного, перед нами стоит задача создания этих интерфейсов, которые будут отправлять и получать объекты JSON в ExtJS в restful режиме.

После обсуждения нашей модели домена мы остановились на одном. Вскоре мы поняли, что некоторые таблицы в системе будут состоять из информации из нескольких объектов домена.

После некоторых поисков мы нашли JSON RESTful API для плагина GORM, который в основном предоставляет RESTful интерфейс для любого заданного объекта домена.

Это подводит нас к основной сути вопроса.

На мой взгляд, есть два способа продолжить.

1) Создайте контроллер, специфичный для каждой таблицы данных в ExtJS, который будет выполнять различные действия, и в рамках каждого действия он будет создавать или получать объект JSon для выполнения CRUD для различных объектов домена, используемых таблицей данных.

На мой взгляд, это заняло бы больше времени. В любом случае, это вариант.

2) Другой вариант заключается в использовании вышеупомянутого плагина путем создания «составного» объекта домена, специфичного для datatable, который мы хотим заполнить (каждый атрибут в этом объекте является столбцом в datatable). После этого просто предоставьте его с помощью плагина JSON RESTful API для GORM, который в основном выполняет за нас все действия CRUD.

Есть ли вообще способ создать объект, подобный тому, который мы хотим в нашей модели домена, фактически не создавая больше таблиц базы данных в серверной части?

Я считаю, что мы на правильном пути, нам просто нужно немного рекомендаций от экспертов 🙂

заранее спасибо!

Ответ №1:

Интересно.

В итоге я использовал другой подход, дайте мне знать, что вы думаете.

В принципе, в итоге мы использовали этот плагин: http://grails.org/plugin/json-rest-api предоставить класс домена и позаботиться обо всех операциях CRUD.

Что мы сделали, так это создали пользовательский маршаллер JSON для каждого класса, вот так.

Bootstrap.groovy

 [...] 
        JSON.registerObjectMarshaller(Person){ 
                def returnArray = [:] 

                returnArray['id'] = it.id 
                returnArray['name'] = it.name 
                returnArray['street'] = it.address.street 

                return returnArray 
        }
  

Person.groovy

       //the plugin exposes the class with this 
       static expose = ['person'] 

       String name 
       Address address 
[...] 
  

Маршаллер фактически воздействует на то, как класс будет преобразован при вызове метода «как JSON».

Итак, теперь, благодаря плагину, мы можем сделать

GET http://mydomain.com/api/person и мы получаем объект json, который содержит информацию от person и других классов, подобных этому:

 {"data":{"id":"1", "name":"Peter", "Spooner St"}} 
  

Единственное, что нам теперь нужно выяснить, как обновить уличный адрес с помощью update или create, если это возможно.

Мысли?

Ответ №2:

В вашем случае я бы рекомендовал создать набор командных объектов и контроллеров, которые их обрабатывают. Это элегантно позволит использовать ваш «составной» подход.

Командный объект — это класс, который обладает всеми классными возможностями проверки и привязки данных, которые есть у объектов домена, но без прямого сохранения.

Ссылки для проверки:

Командные объекты

Ответы в формате JSON

Комментарии:

1. Интересно… позвольте мне прочитать об этом. В ответах я предложил другое решение, дайте мне знать, что вы думаете.