MONTREAL 1/3 JULY 2011




ERRest: mais qu'est-ce que c'est?
Pascal Robert
MacTI
REST??
(non non, pas Rest In Peace)
REST?
•   REST veut dire : Representational State Transfer (hein?)

•   C'est un style d'architecture, ce n'est pas un protocole

•   Utilisation à fond la caisse du protocole HTTP

•   Le format peut être n'importe quoi (XML, JSON, Plist)

•   Comme une Direct Action, mais mieux structuré

•   Sans état (« stateless »)!
Méthodes
   Méthode HTTP                Action
        GET             Obtenir (« fetch »)
       POST             Créer (« create »)
        PUT          Mettre à jour (« update »)
      DELETE                   Effacer
TRACE/OPTIONS/HEAD        Méta-données
Exemples d'URL

•   GET /ra/membres.json

•   GET /ra/membres/2.json

•   POST /ra/membres.json

•   PUT /ra/membres/2.json

•   DELETE /ra/membres/2.json
Exemples de MAUVAIS URLs


•   GET /ra/membres/2/delete.json

•   POST /ra/membres/2.json
Actions supplémentaires

•   On ajoute le nom de l'action à la fin.

•   Normalement, ce sont que des méthodes GET

•   Exemples:

    •   GET /ra/membres/2/autreListe.json

    •   PUT /ra/membres/2/sousObjet.json
Méta-données

•   On utilise les entêtes HTTP (y compris les cookies)

•   Exemple:
    Content-Language: fr-fr
    X-Batch: 0-99
Paramètres

•   Utilisation de paramètres pour filtrer une méthode GET? On
    peut utiliser les paramètres de requêtes (« query arguments »).

•   Exemple:
    GET /ra/membres.json?batch=2&batchSize=20
WebObjects et REST
ERREST

•   Canevas ajouté à Project Wonder en 2009.

•   Basé sur le style de RoR.

•   Formats disponibles sont Plist, Plist binaire, JSON et XML.

•   Fait beaucoup de travail à notre place.
Architecture de ERREST


•   Offre un « request handler » unique.

•   ERREST fonctionne avec des routes et des controlleurs.

•   Basé sur les entités EO.
REST Request Handler
•   Est un nouveau « request handler » (/ra)

•   Gère les requêtes pour /ra/* et enregistre les routes.

•   Exemple tout simple:
    ERXRouteRequestHandler restRequestHandler = new ERXRouteRequestHandler();

    restRequestHandler.addDefaultRoutes(Member.ENTITY_NAME);

    ERXRouteRequestHandler.register(restRequestHandler);
Route

•   Une « route » est l'URI de la représentation de l'objet.

•   Elle indique aussi quel controlleur utilisé

•   ... et la méthode à appeler.
    new ERXRoute(Presentation.ENTITY_NAME,"/call-for-papers/{presentation:Presentation}/edit",
    PresentationsController.class, "updatePaper")
Controlleurs


•   Comme dans le modèle MVC.

•   Est le lien entre les routes, l'entité et les méthodes.

•   Doivent hériter de ERXRouteController ou ses dérivés.
Controlleur de base


•   ERXDefaultRouteController offre les méthodes de base pour les
    opérations courantes (GET, POST, PUT, DELETE)

•   L’enregistrement des routes se fait avec un seul appel:
    ERXRouteRequestHandler.addDefaultRoutes(NomEntite)
Formats

•   Format par défaut est XML

•   Autres formats supportés: JSON, HTML, Plist, SproutCore, Rails

•   Peut être modifié par controlleur
    @Override

    protected ERXRestFormat defaultFormat() {
      return ERXRestFormat.json();
    }
Key Filters


•   Les « filtres par clés » sont la liste des attributs entrée/sortie.

•   Utilisation de ERXKey et ERXKeyFilter.

•   Clés en sortie peuvent être différentes que celles en sortie.
Relations 1:N

•   Ne sont pas ajoutés par défaut par
    ERXKeyFilter.filterWithAttributesAndToOneRelationships()

•   Il faut utiliser withAllRecursive ou faire:
    ERXKeyFilter filtreDeRelation = ERXKeyFilter.filterWithAttributes();

    ERXKeyFilter filtreDeSource = ERXKeyFilter.filterWithAttributes();

    filtreDeSource.include(Source.RELATION, filtreDeRelation);
Paramètres de requêtes
•   Pour une requête GET, permet de filtrer la réponse
    /ra/membres.json?batch=2&batchSize=20

•   ERXFetchSpecification supporte les paramètres suivants:
    •   batchSize

    •   batch

    •   sort

    •   qualifier
POJO

•   Support POJO (bref, non-EO) est disponible dans ERRest.

•   Vous devez créer un délégué qui hérite de
    ERXAbstractRestDelegate.

•   Convention: si nom du délégué est
    <NomClass>RestDelegate.java, sera automatiquement
    enregistré.
Alias


•   On peut renommer des noms d'entités ou d'attributs.

•   On utilise ERXRestNameRegistry.setExternalNameForInternalName:
    •   ERXRestNameRegistry.registry().setExternalNameForInternalName("Pet", "Animal");
Authentification
•   Plusieurs solutions:

    •   Session (mais disponible que pour une seule instance)

    •   Token

    •   OpenID

    •   Basic ou Digest

    •   Cookies (pour clients HTML)
Routage HTML

•   Permet d'utiliser des composantes WO si format demandé est
    HTML.

•   Utilise pour créer des petites applications « stateless ».

•   Plus nécessaire de créer un paquet de DirectActions.

•   Mêmes routes pour routage HTML que pour requêtes JSON/
    XML/etc.
Routage HTML
•   Les composantes doivent implémenter IERXRouteComponent.

•   Doit nommer les composantes « NomEntiteActionPage ».

•   Exemples:
    •   MonEntiteIndexPage

    •   MonEntiteCreatePage

    •   MonEntiteDestroyPage

•   Vous pouvez aussi retourner des pages avec pageWithName.
Exemple
Resources
•   http://www.slideshare.net/wocommunity/errest

•   http://www.slideshare.net/wocommunity/er-rest-designinggoodapi

•   http://www.slideshare.net/wocommunity/errest-and-dojo

•   http://www.wocommunity.org/podcasts/wowodc/2010/ERRest.mov

•   http://webobjects.mdimension.com/wonder/screencasts/ERRest-2010-02-16.mov

•   http://wiki.objectstyle.org/confluence/display/WONDER/ERRest+Framework

•   RESTful Web Services Cookbook (OReilly)

•   REST in Practice (OReilly)

Introduction à ERRest

  • 1.
    MONTREAL 1/3 JULY2011 ERRest: mais qu'est-ce que c'est? Pascal Robert MacTI
  • 2.
    REST?? (non non, pasRest In Peace)
  • 3.
    REST? • REST veut dire : Representational State Transfer (hein?) • C'est un style d'architecture, ce n'est pas un protocole • Utilisation à fond la caisse du protocole HTTP • Le format peut être n'importe quoi (XML, JSON, Plist) • Comme une Direct Action, mais mieux structuré • Sans état (« stateless »)!
  • 4.
    Méthodes Méthode HTTP Action GET Obtenir (« fetch ») POST Créer (« create ») PUT Mettre à jour (« update ») DELETE Effacer TRACE/OPTIONS/HEAD Méta-données
  • 5.
    Exemples d'URL • GET /ra/membres.json • GET /ra/membres/2.json • POST /ra/membres.json • PUT /ra/membres/2.json • DELETE /ra/membres/2.json
  • 6.
    Exemples de MAUVAISURLs • GET /ra/membres/2/delete.json • POST /ra/membres/2.json
  • 7.
    Actions supplémentaires • On ajoute le nom de l'action à la fin. • Normalement, ce sont que des méthodes GET • Exemples: • GET /ra/membres/2/autreListe.json • PUT /ra/membres/2/sousObjet.json
  • 8.
    Méta-données • On utilise les entêtes HTTP (y compris les cookies) • Exemple: Content-Language: fr-fr X-Batch: 0-99
  • 9.
    Paramètres • Utilisation de paramètres pour filtrer une méthode GET? On peut utiliser les paramètres de requêtes (« query arguments »). • Exemple: GET /ra/membres.json?batch=2&batchSize=20
  • 10.
  • 11.
    ERREST • Canevas ajouté à Project Wonder en 2009. • Basé sur le style de RoR. • Formats disponibles sont Plist, Plist binaire, JSON et XML. • Fait beaucoup de travail à notre place.
  • 12.
    Architecture de ERREST • Offre un « request handler » unique. • ERREST fonctionne avec des routes et des controlleurs. • Basé sur les entités EO.
  • 13.
    REST Request Handler • Est un nouveau « request handler » (/ra) • Gère les requêtes pour /ra/* et enregistre les routes. • Exemple tout simple: ERXRouteRequestHandler restRequestHandler = new ERXRouteRequestHandler(); restRequestHandler.addDefaultRoutes(Member.ENTITY_NAME); ERXRouteRequestHandler.register(restRequestHandler);
  • 14.
    Route • Une « route » est l'URI de la représentation de l'objet. • Elle indique aussi quel controlleur utilisé • ... et la méthode à appeler. new ERXRoute(Presentation.ENTITY_NAME,"/call-for-papers/{presentation:Presentation}/edit", PresentationsController.class, "updatePaper")
  • 15.
    Controlleurs • Comme dans le modèle MVC. • Est le lien entre les routes, l'entité et les méthodes. • Doivent hériter de ERXRouteController ou ses dérivés.
  • 16.
    Controlleur de base • ERXDefaultRouteController offre les méthodes de base pour les opérations courantes (GET, POST, PUT, DELETE) • L’enregistrement des routes se fait avec un seul appel: ERXRouteRequestHandler.addDefaultRoutes(NomEntite)
  • 17.
    Formats • Format par défaut est XML • Autres formats supportés: JSON, HTML, Plist, SproutCore, Rails • Peut être modifié par controlleur @Override protected ERXRestFormat defaultFormat() { return ERXRestFormat.json(); }
  • 18.
    Key Filters • Les « filtres par clés » sont la liste des attributs entrée/sortie. • Utilisation de ERXKey et ERXKeyFilter. • Clés en sortie peuvent être différentes que celles en sortie.
  • 19.
    Relations 1:N • Ne sont pas ajoutés par défaut par ERXKeyFilter.filterWithAttributesAndToOneRelationships() • Il faut utiliser withAllRecursive ou faire: ERXKeyFilter filtreDeRelation = ERXKeyFilter.filterWithAttributes(); ERXKeyFilter filtreDeSource = ERXKeyFilter.filterWithAttributes(); filtreDeSource.include(Source.RELATION, filtreDeRelation);
  • 20.
    Paramètres de requêtes • Pour une requête GET, permet de filtrer la réponse /ra/membres.json?batch=2&batchSize=20 • ERXFetchSpecification supporte les paramètres suivants: • batchSize • batch • sort • qualifier
  • 21.
    POJO • Support POJO (bref, non-EO) est disponible dans ERRest. • Vous devez créer un délégué qui hérite de ERXAbstractRestDelegate. • Convention: si nom du délégué est <NomClass>RestDelegate.java, sera automatiquement enregistré.
  • 22.
    Alias • On peut renommer des noms d'entités ou d'attributs. • On utilise ERXRestNameRegistry.setExternalNameForInternalName: • ERXRestNameRegistry.registry().setExternalNameForInternalName("Pet", "Animal");
  • 23.
    Authentification • Plusieurs solutions: • Session (mais disponible que pour une seule instance) • Token • OpenID • Basic ou Digest • Cookies (pour clients HTML)
  • 24.
    Routage HTML • Permet d'utiliser des composantes WO si format demandé est HTML. • Utilise pour créer des petites applications « stateless ». • Plus nécessaire de créer un paquet de DirectActions. • Mêmes routes pour routage HTML que pour requêtes JSON/ XML/etc.
  • 25.
    Routage HTML • Les composantes doivent implémenter IERXRouteComponent. • Doit nommer les composantes « NomEntiteActionPage ». • Exemples: • MonEntiteIndexPage • MonEntiteCreatePage • MonEntiteDestroyPage • Vous pouvez aussi retourner des pages avec pageWithName.
  • 26.
  • 27.
    Resources • http://www.slideshare.net/wocommunity/errest • http://www.slideshare.net/wocommunity/er-rest-designinggoodapi • http://www.slideshare.net/wocommunity/errest-and-dojo • http://www.wocommunity.org/podcasts/wowodc/2010/ERRest.mov • http://webobjects.mdimension.com/wonder/screencasts/ERRest-2010-02-16.mov • http://wiki.objectstyle.org/confluence/display/WONDER/ERRest+Framework • RESTful Web Services Cookbook (OReilly) • REST in Practice (OReilly)