Grails retornos (render, respond, redirect, return, forward, chain)
Renderiza distintas respuestas: texto, etc., objetos, templates, vistas.
Lo que hace render es renderizar una respuesta (response) hacia la misma página que realizó la petición (request), por lo tanto si no se indica una vista, render enviará la respuesta hacia la misma vista que lo invocó.
Ejemplo 1:
uri: "test/index"
class TestController {
def index() {
render view: "index2"
}
}
Invoca la acción: "test/index" (request), la cual envía como respuesta (response) el contenido de la página "index2" (la renderiza). Note que como tal no invoca a la página "index2", solo renderiza su contenido cuando se solicita la acción "index". Por lo tanto la url que permanece en el browser después de la acción es "test/index".
Ejemplo 2:
render "some text"
: Envía el texto como respuesta (response) hacia la misma página que invocó la acción (request).
Renderiza una respuesta en el content-type solicitado por el cliente.
Funciona igual que render (aunque con distintas convenciones), con la diferencia que transforma el objeto retornado en el content-type solicitado por el request (en la cabecera Accept).
Respond fue agregado a partir de grails 2.3 se agregó este método como una necesidad a los REST Web Services.
Ejemplo:
// pick the best content type of Accept to respond with
respond Book.get(1)
respond Vendedor.list()
: Se envía a la vista un modelo con el nombre vendedorInstanceList
respond new Hotel()
: Se envía a la vista un modelo con el nombre: hotelInstance
Invoca una acción desde una acción (http redirect).
Para poder invocar una acción desde una acción es necesario que el browser vuelva a lanzar otra petición con la nueva acción a ejecutar, para realizarlo se lanza un http redirect (regresa al browser y el mismo vuelve a lanzar la nueva acción).
redirect map
: Recibe un mapa como argumento, esta es la manera tradicional de invocar el método redirect.
redirect objectInstance
: Por convención: si objectInstance es una clase de dominio entonces Grails redirecciona a la vista "show" del controlador y envía como parámetro el id del objectInstance.
Manera en la que funciona redirect a nivel HTTP
Los métodos no terminan la ejecución de una acción:
Es importante saber que cualquiera de los métodos utilizados en un controlador (render, response, chain, etc.) NO terminan la ejecución de la acción y hay que invocar return después de la sentencia para salir del método. A menudo se omite en la última sentencia porque por defecto retorna.
`return [var:value] // modelo``: Renderiza (con render) a la vista por convención y manda el modelo indicado.
return variable; // ERROR !!!
: No retorne variables porque NO CAUSA NINGÚN EFECTO, SOLO SE PUEDEN RETORNAR MAPAS.
return []
: Renderiza (con render) a la vista por convención, retorna un modelo vacío.
return null
: Envía a la vista por convención, retorna un modelo nulo.
Acción sin retorno
: Es peligroso dejar acciones sin retorno porque groovy implicitamente retorna la última expresión evaluada.
return new ModelAndView(...)
: Es otra forma de retornar más explicita. Respeta las convenciones.
withFormat
: Indica cómo renderizar en base al formato. Se puede indicar el formato en la url:?format=xml
Invocar una acción desde otra acción (en el lado servidor)
Se realiza a nivel del servidor, se invoca una acción desde otra acción para ir agregando atributos al request.
Ejemplo: forward controller: "book", action: "show"
Invoca una acción desde otra (con http redirects) y hace chain del request.
Va guardando los datos entre request y request en el objeto flash.
Ejemplo: chain(action: "details", model: [book: nombreDelViento])
Se puede hacer lo mismo con respond y con render, respond solo es un método que internamente invoca a render:
Con respond se obtiene implicitamente el content-type en el que se retorna el objeto:
Accept: text/json:
respond responseData
Con render se debe indicar explicitamente el conten-type en el que se retorna el objeto: render responseData as JSON
.