2012-01-18 10 views
7

Questa potrebbe sembrare una domanda strana, ma sto cercando di capire quale sia la "migliore pratica" per convertire un'applicazione che è impostato per utilizzare qualcosa come la generazione di controller di Roo o Grails (che fornisce funzionalità CRUD di base) a qualcosa che restituisce un corpo di risposta JSON invece di essere utilizzato in un'applicazione JavaScript.Come passare da un progetto Spring Roo o Grails dal tipico MVC ad AJAX/JSON/REST

L'ambiguità della tecnologia qui è perché non ho ancora avviato il progetto. Sto ancora cercando di decidere quale tecnologia (basata su Java) usare e di vedere quale tipo di strumenti di produttività dovrei imparare/utilizzare nel processo. Sarà un'applicazione web e utilizzerà un livello di persistenza del database. Tutti gli altri dettagli sono nell'aria.

Forse il modo più semplice per raggiungere il mio obiettivo è quello di sviluppare utilizzando una sorta di plug-in AJAX per iniziare, ma la maggior parte delle esercitazioni e delle descrizioni in uscita dicono di iniziare con una normale architettura MVC. Roo sembra rendere difficile la conversione dei controller che genera per i tipi di ritorno compatibili con JSON, e non ho familiarità con Groovy/Grails per sapere cosa serve per farlo.

Questa è principalmente un'esperienza di apprendimento per me, e sono aperto a qualsiasi critica o consiglio, ma essendo un forum Q/A, mi rendo conto di dover incorporare una domanda obiettiva di qualche tipo. Per soddisfare questa esigenza, chiedo:

Qual è il modo migliore per configurare un'interfaccia AJAX/RESTful per le mie entità in Roo e/o Grails?

risposta

8

Recentemente ho fatto esattamente questo con un'applicazione Grails e ho trovato sorprendentemente facile prendere i controller generati e farli emettere JSON o XML o HTML dalla vista a seconda della negoziazione del contenuto.

I punti nel manuale di Grails per esaminare sono le sezioni sulla negoziazione del contenuto e, se è necessario gestire l'input JSON o XML, il marshalling.


Per ottenere JSON e output XML, nel metodo di default list(), cambiato a questo (ho un oggetto Session, in questo caso ... una delle mie classi di dominio):

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

Ovunque si restituisca solo un oggetto per impostazione predefinita, si desidera sostituire il valore restituito con il blocco withFormat.

Potrebbe anche essere necessario aggiornare il file Config.groovy in cui si tratta di tipi mime. Ecco quello che ho:

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

Come input (ad un'azione update() o save(), per esempio) JSON e XML carichi saranno automaticamente eseguito l'unmarshalling e saranno vincolati proprio come un modulo di input sarebbe, ma io ho scoperto che il processo di smascheramento è un po 'schizzinoso (specialmente con JSON).

ho scoperto che, al fine di JSON da gestire correttamente nel metodo update(), l'attributo class doveva essere presente e corretto sull'oggetto JSON entrata. Dal momento che la libreria che stavo usando nella mia applicazione client non rendeva questo un problema facile da trattare, sono passato a usare XML.

+0

Grazie per una risposta così elaborata! Questo è esattamente il tipo di cosa che stavo cercando. – Andy

Problemi correlati