2012-01-18 28 views
7

Może to wydawać się dziwnym pytaniem, ale staram się zrozumieć, jaka "najlepsza praktyka" służy do konwersji aplikacji, która jest skonfigurowany tak, aby używać czegoś takiego jak generatory kontrolerów Roo lub Grails (które zapewniają podstawową funkcjonalność CRUD) do czegoś, co zwraca ciało odpowiedzi JSON zamiast do użycia w aplikacji JavaScript.Jak zamienić projekt Spring Roo lub Grails z typowego MVC na AJAX/JSON/REST

Niejednoznaczność technologii polega na tym, że jeszcze nie rozpocząłem projektu. Nadal staram się zdecydować, która technologia (oparta na języku Java) ma być używana i zobaczyć, jakich narzędzi wydajnościowych powinienem się nauczyć/użyć w tym procesie. Będzie to aplikacja internetowa i będzie korzystać z warstwy trwałości bazy danych. Wszystkie inne szczegóły są w powietrzu.

Być może najłatwiejszym sposobem osiągnięcia mojego celu jest opracowanie za pomocą jakiejś wtyczki AJAX na początek, ale większość tutoriali i opisów mówi, że zaczyna się od normalnej architektury MVC. Roo wydaje się, że konwersja kontrolerów, które generuje, na typy przyjazne dla JSON, jest trudna, a ja nie znam się wystarczająco dobrze z Groovy/Grails, aby wiedzieć, co to oznacza.

Jest to przede wszystkim doświadczenie edukacyjne dla mnie i jestem otwarty na wszelką krytykę lub radę, ale będąc forum pytań i odpowiedzi, zdaję sobie sprawę, że muszę wprowadzić jakieś obiektywne pytanie. Aby wypełnić tę potrzebę, pytam:

Jaki jest najlepszy sposób na skonfigurowanie interfejsu AJAX/RESTful dla moich podmiotów w grze Roo i/lub Grails?

Odpowiedz

8

Niedawno zrobiłem dokładnie to z aplikacją Grails i odkryłem, że zaskakująco łatwo jest pobrać wygenerowane kontrolery i przekonwertować je do wyjścia JSON lub XML lub HTML z widoku w zależności od negocjacji treści.

Miejsca w podręczniku Grails, do którego należy zajrzeć, to sekcja (s) Negocjacji treści i, jeśli zajdzie potrzeba poradzenia sobie z JSON lub wejściem XML, marszałkowanie.


Aby uzyskać JSON i XML wyjście w domyślnej metody list(), zmienił go do tego (mam Session obiektu, w tym przypadku ... jeden z moich klas domen):

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} 
    } 
} 

Wszędzie, gdzie zwracasz tylko obiekt domyślnie, będziesz chciał zastąpić zwróconą wartość blokiem withFormat.

Może być również konieczne zaktualizowanie pliku Config.groovy, w którym dotyczy on typów MIME. Oto co mam:

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' 
        ] 

jako wejście (do działania update() lub save(), na przykład), JSON i XML ładowność zostanie automatycznie konwertowana będzie związany podobnie jak wejście forma będzie, ale odkryłem, że proces unmarshaling jest nieco wybredny (szczególnie w przypadku JSON).

Znalazłem, że aby JSON był obsługiwany poprawnie w metodzie update(), atrybut class musiał być obecny i poprawny w obiekcie JSON danych przychodzących. Ponieważ biblioteka, której używałem w mojej aplikacji klienckiej, nie sprawiała, że ​​było to łatwe, zmieniłem ją na XML.

+0

Dziękuję za tak wyszukaną odpowiedź! To jest dokładnie to, czego szukałem. – Andy

Powiązane problemy