Grails 3: Esconder o nome da action na URL para aplicar padrão REST
24/08/2015 12:43
0
Quero aplicar o padrão REST de nomenclatura url em meu sistema. Sendo assim, a action ficaria de fora da url e o grails identificaria qual URL chamar conforme o tipo de método HTTP utilizado.
Por exemplo:

Método GET -> sem id, lista todos os registros. Com id, chama a action show
Método POST -> chama a action create independente de parâmetro
Método PUT -> só funcionaria com id. Chama a action update
Método DELETE -> só funcionaria com id.. chama a action delete

Isto se aplicaria apenas as 4 operações CRUD básicas. Demais actions devem estar disponíveis na URL
Tags: UrlMappings REST action HTTP GET POST PUT DELETE esconder



0
eu não posso utilizar a variável $controller pra deixar as coisas dinâmicas? Para cada domain class existente eu preciso aplicar o mapeamento?
tentei utilizar "/$controller" (resources: "${controller}")  mas as URL apontam para a view do erro 404 :/
24/08/2015 13:32


0
Pablo,
  Outra maneira de conseguir o que quer, é no index da sua controller (que normalmente pode ser acessado apenas por "suaDomainController/") vc coloca as verificações que precisa, ex:
switch(request.method){
case "GET":
? ?//Chama seu serviço de lista de itens
?case "POST":
? ?//chama seu serviço de save
?etc...
}

É menos elegante que fazer uma configuração única, mas vc pode colocar isso no seu scaffold da controller e gerar automaticamente para todas suas controllers, deve funcionar.
você pode criar um "filter" também para fazer isso, talvez este post possa te ajudar.
24/08/2015 16:44


1
de uma olhada aqui https://grails.github.io/grails-doc/latest/guide/webServices.html#REST
Aparentemente basta adicionar uma anotação ao domain e o framework já gera o controller e os mapeamentos apropriados


0
Oi Pablo,

na realidade você pode sim, usar as variáveis controllerName, actionName, etc em outras configurações dentro do seu arquivo UrlMappings.groovy. Olha alguns exemplos:

   "/api/${controllerName}/${actionName}" {
          redirect(controller:controllerName, action:actionName)
   }


Ou mesmo passar o ID oculto

"/api/${controllerName}/$id" {
       redirect(controller:controllerName, action:"show", id:id)
}


0
Henrique, mas assim só funcionaria para o show, certo? Caso fosse uma requisição PUT ou DELETE este caso não seria o ideal.

A opção levantada pelo Magno parece interessante, uma vez que basta adicionar uma anotação na classe. Só não me parece muito confortável definir em uma classe de domínio a url que será manipulada pela Controller...
Vou dar uma olhada melhor nas opções. Pensei bem e também vi o lado positivo, onde definir as URLs de forma estática no arquivo UrlMappings pode ser uma boa, pois ai posso seguir o padrão RESTful arrisca, colocando inclusive o nome da classe de domínio no plural na URL. Como trabalho distribuído este tipo de convenção agrega muito ao projeto.

Obrigado, pessoal!
25/08/2015 21:47


0
"Só não me parece muito confortável definir em uma classe de domínio a url que será manipulada pela Controller"
Não pense como se você estivesse misturando a camada controladora na camada de domínio, ao menos eu não enxergo desta forma. Não há nenhuma lógica referente a controladores sendo inserida no domínio, pense apenas que você está declarando para o framework que aquele domínio deverá ser exposto



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto