Lucas Teixeira

@lucastex

Arquivo para a tag ‘render’

Devolvendo um texto como attachment no response

sem comentários

Me deparei com a seguinte situação em uma aplicação construída usando Grails.

O sistema gravaria o conteúdo de um arquivo (plain xml mesmo) dentro do banco de dados, para evitar dependências com filesystem. Mas este arquivo também precisaria ser lido posteriormente. A solução que estava disponível, era alguma coisa mais ou menos assim:

def arquivo = Arquivo.get(params.id) //recupera o arquivo da base
render arquivo.texto

Legal, desta maneira (bem simples até), o conteúdo deste texto seria renderizado na página para o usuário poder salvá-la.

Imaginei que isto pudesse ser incrementado um pouco, e percebi que fazer com que o usuário tivesse que salvar a página (que continha apenas o XML) poderia se tornar um tanto chato com o passar do tempo. Resolvi alterar a action para devolver o texto em anexo ao response. Isso mesmo, com a caixinha para poder salvá-lo.

Olha que simples:

def arquivo = Arquivo.get(params.id) //recupera o arquivo da base
response.setContentType "text/xml"
response.setHeader "Content-Disposition", "attachment;filename=\"${arquivo.nome}.xml\""
response << arquivo.texto

Simples, colocando a instrução no header para que a “disposição” da resposta seja “attachment” (anexo), o browser ao invés de renderizar apenas o conteudo, retorna um arquivo com este texto.

Written by Lucas Teixeira

January 27th, 2010 at 10:48 am

Renderizando um XML como resposta em grails

com 7 comentários

Se em grails você precisar renderizar um XML como resposta de uma action, use o método render junto com o builder de XML que temos disponível. Muito fácil, rápido e objetivo.

No exemplo abaixo, um parâmetro nome é passado para a action, que faz uma consulta baseado neste parâmetro e nos nomes dos clientes.

def busca = {
   def clientes = Cliente.findAllByNomeIlike("%${params.nome}%")

   render(contentType: "text/xml") {
      results() {
         clientes.each {
            cliente -> result() {
               id(cliente.id)
               nome(cliente.nome)
            }
         }
      }
   }
}

Explicando o auto-explicativo:

Linha 2: Usamos um método dinâmico do grails (não, este método não existe na classe) que permite que eu localize todos os clientes (findAll) por seus nomes (byNome) Ilike (case insensitive) usando o parâmetro nome que veio no request. Esta lista é armazenada na referência clientes.

Linha 4: Pela funcão render deixamos claro que iremos renderizar um conteúdo text/xml

Linha 5: Esta será a nossa tag root do xml: results. A closure que se abre definirá os filhos deste nó.

Linha 6: Cada cliente na lista retornada…

Linha 7: Será um novo nó result do XML de resposta

Linhas 8 e 9: Os fois filhos de result, teremos o id do cliente e seu nome, suficiente para uma combo com auto-complete!
O resultado foi como esperado, e o tempo de fazer o exemplo funcionar foi definitivamente menor que o de escrever este post!

<results>
   <result>
      <id>313</id>
      <nome>JOSE DA SILVA</nome>
   </result>
   <result>
      <id>817</id>
      <nome>PATRICIA MARIA SILVA E SILVA</nome>
   </result>
   <result>
      <id>91</id>
      <nome>MARCOS SILVINO</nome>
   </result>
</results>

Written by Lucas Teixeira

November 3rd, 2009 at 10:45 am

Postado em Grails

Com as tags , , , ,

Get Adobe Flash playerPlugin by wpburn.com wordpress themes