Implémenter une API REST dans une application Grails

Je me demandais quelle serait la meilleure approche pour qu'une application Grails offre une API RESTful (certaines actions CRUD principalement) qui peut être utilisée par un service web, par exemple lorsque vous voulez créer une application iOS correspondante à votre application basée sur un navigateur ou autre chose.

J'ai pensé à construire une partie séparée dans mon application Grails qui prend des appels de www.mywebapp.com/api/someAction afin que je puisse réutiliser la couche de Service. Comment ferais-je le mappage D'URL alors? Seulement avoir un grand ApiController ne sonne pas très groovy.

Ou y a-t-il une meilleure approche que je ne connaissais pas? Cette approche doit prendre en charge quelque chose comme OAuth pour authentifier l'utilisateur qui appelle le service Web.

26
demandé sur cdeszaq 2012-03-30 00:05:19

4 réponses

Graal peut - certainement fournit une api REST, mais le niveau de difficulté varie en fonction de la façon dont mature (aka. comment RESTful) vous voulez que L'API soit.

Repos de base

Obtenir un niveau de base de RESTfullness, où vous manipulez des représentations JSON ou xml de ressources en utilisant la totalité des verbes HTTP et en tirant parti des codes de réponse HTTP, est assez facile. Il y a 3 pièces principales pour obtenir cela lieu:

  1. Le mappage d'URL

    Voici un exemple de la façon dont j'ai écrit mes mappages D'URL sur un projet récent pour permettre des URL Plus RESTful:

    // RESTful list mapping
    name restEntityList: "/$controller"(parseRequest: true) {
        action = [GET: "list", POST: "save"]
    }
    
    // RESTful entity mapping
    name restEntity: "/$controller/$id"(parseRequest: true) {
        action = [GET: "show", PUT: "update", POST: "update", DELETE: "delete"]
        constraints {
            id matches: /\d+/
        }
    }
    
  2. La négociation de Contenu

    Les 3 différentes façons dont Grails peut gérer la négociation de contenu rendent le framework très flexible, vous permettant de prendre en charge un éventail beaucoup plus large de clients qui peuvent ne pas être en mesure de définir des choses comme L'en-tête Accept HTTP.

    Vous pouvez utiliser le négociation de contenu pour répondre à différentes demandes de différentes manières en utilisant le withFormat bloquer en fonction de ce que le client a indiqué qu'il voulait. Cette capacité puissante peut également être utilisée pour la version de votre API, un peu comme GitHub fait .

  3. Le statut de la Réponse

    HTTP a déjà un excellent mécanisme de réponse intégré qui vous permet de tirer parti des capacités innées de l'architecture, Comme la cacheability et les opérations indemnipotentes. Alors certains navigateurs web ne gèrent pas certains codes de réponse très gracieusement, les applications clientes utilisant votre API peuvent les utiliser pour simplifier considérablement leur code interne.

REPOS SEC

L'une des meilleures façons de rendre votre application RESTful et de la garder au sec en même temps est de tirer le meilleur parti de l'échafaudage du contrôleur autant que possible, puisque CRUD est essentiellement le même pour tous les objets de domaine. cet article sur le fait de rendre le contrôleur par défaut plus RESTful, et cet article sur la simplification du contrôleur par défaut sont deux excellentes ressources pour obtenir plus de puissance de l'échafaudage.

Repos avancé

Une fois arrivé à ce point, vous avez une API REST assez fonctionnelle pour votre application grails. Vous pouvez effectuer toutes les opérations CRUD de base et les ressources sont assez faciles à utiliser.

Les prochains niveaux de l'échelle à une véritable API hypermédia RESTful, cependant, sont Beaucoup plus difficiles à atteindre. La réparation est sur la route carte pour Grails, mais actuellement c'est plutôt douloureux. Ces pièces sont:

  1. ressources hypermédia
  2. types de contenu
  3. Versioning

Heureusement, il y a un plugin qui rend la définition des marshallers personnalisés très facile, ce qui nous permet de couvrir assez facilement les trois pièces restantes du puzzle REST.

Enfin, il y a l'aspect de sécuriser le tout. En général, Spring Security vous tiendra en bonne place jusqu' comme la sécurisation de l'accès utilisateur à votre api. Comme la plupart des accès à L'API proviennent d'une application et ne sont pas visibles par l'utilisateur, l'authentification de base ou digest est généralement la solution la plus simple. Il y a un plugin OAuth {[8] } qui s'appuie sur Spring Security. Je ne l'ai pas personnellement utilisé, donc je ne peux pas garantir sa stabilité, mais cela me semble plutôt bon.

En général, Grails est assez flexible et puissant pour se reposer très, très bien, mais le travail n'a pas encore été fait pour le faire se reposer proprement out-of-the-box.

57
répondu cdeszaq 2016-04-27 16:47:47

La documentation grails a une bonne marche sur la mise en place d'une api RESTfull

Http://grails.org/doc/latest/guide/webServices.html#13.1

6
répondu nate_weldon 2012-03-30 14:02:02

Vous pouvez le mapper de toute façon, utilisez n'importe quelle structure d'url. Grails UrlMapping est assez flexible, c'est seulement le comportement par défaut pour mapper à /$controller/$action, mais vous pouvez utiliser votre propre mappage, vous pouvez mapper chaque url manuellement, etc.

Voir UrlMapping docs - http://grails.org/doc/latest/guide/theWebLayer.html#urlmappings

1
répondu Igor Artamonov 2012-03-29 21:18:54
  • Mappage d'Url:

    "/api/élément/$version/$master" { controller = "élément" action = [LIRE:"afficher"] }

Cela mappera Le HTTP get à la méthode show de l'élément controller.

  • c'est à dire la méthode show:

SEC: L'api est probablement la même logique que l'application. La différence est la négociation de contenu.

...

def show = {
    def elements = elementService.findByMasterVersion(params.master, params.version)
    withFormat {
        xml {
            render(status:200,text:elements as XML, contentType:"text/xml",encoding:"UTF-8")
        }
        json { ... }
        html { ... }
    }
}
  • Oauth est sacrément compliqué à mettre en œuvre et semble exagéré pour beaucoup de situation.
1
répondu moskiteau 2012-05-02 18:10:21