2009-06-05 12 views
7

Disons que nous avons une application web Grails exposant plusieurs ressources.Application RESTful Grails: DRy up UrlMapping

  • balises
  • urls
  • utilisateurs

L'application dispose d'une interface web classique que les utilisateurs interagissent avec et une administration. Nous voulons exposer les ressources de l'application aux clients via une API RESTful et nous ne voulons pas que cette partie de l'application encombre les contrôleurs et le code que nous avons déjà. Donc, nous sommes arrivés à ce qui suit:

Si l'interface Web offre host/app_path/url/[list|show|create], nous voulons que l'API REST soit à /host/app_path/rest/url.

Nous avons donc fini avec le fichier UrlMappings suivant:

Le problème est que ce n'est pas exactement la chose la plus DRY ici. Il devient pire que nous ajoutons plus de ressources telles que les étiquettes. Ils traduisent encore trois autres blocs de code très similaire ...

Les fonctions non-crud seront des choses comme la recherche avec et spécifiques tels critères ...

Nous avons essayé de générer les fermetures de cartographie avec une boucle , mais sans succès. Sommes-nous complètement sur la mauvaise voie ici?

Répondre

7

Je recommande la mise en correspondance suivante:

"/rest/url/$id?"(resource:"urlRest") 

est inférieure à la méthode HTTP à la cartographie d'action que cela créerait pour la urlRestController:

GET   show 
PUT   update 
POST  save 
DELETE  delete 

Je vois pourquoi vous voudrez peut-être la carte/reste/url POST pour enregistrer et/rest/url/id PUT pour mettre à jour, mais cela va à l'encontre de la signification de ces verbes. Un PUT devrait être le seul moyen d'ajouter une nouvelle URL et POST la seule façon de mettre à jour une URL. Le faire de la façon dont vous avez exposé fonctionnerait et pourrait être le meilleur moyen si votre contrainte est de garder votre code de contrôleur actuel intact. Cependant, je suppose que votre contrôleur pourrait déjà être codé pour gérer les mappages par défaut très bien (mise à jour/supprimer donner une erreur si aucun ID, montrer les redirections à la liste si aucun ID, etc.).

+1

Ahh, la chose PUT/POST: D – kungfoo