REST JUG Toulouse 20100615

3 385 vues

Publié le

Publié dans : Technologie
0 commentaire
2 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
3 385
Sur SlideShare
0
Issues des intégrations
0
Intégrations
4
Actions
Partages
0
Téléchargements
0
Commentaires
0
J’aime
2
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive
  • Il n’y a aucune information importante dans le corps de la réponse : tout est dans le statut 200 (OK) La réponse est juste un message parfaitement facultatif
  • On suppose qu’il n’y a qu’un seul utilisateur johndoe. Il y a deux URI pour cette resource. On voit souvent code.google/gwt/doc/2.1 ou code.google/gwt/doc/latest
  • Le serveur doit pouvoir renvoyer une représentation différente selon le contentType demandé. Là encore, on voit que REST est bien proche des origines du protocole HTTP.
  • La Servlet se base sur HTTP. Il y a une URI dans web.xml, et on Override la methode POST En cas de problème, on récupère une exception, qui ne sont pas traitées dans cet exemple
  • On visualise et contrôle les données HTTP reçues. On contrôle également les données Htttp que l’on renvoie Le nom de la fonction est plus sémantique. La simplicité (théorique) du XML reçu permet d’utiliser des fonctions simples (VSX) pour récupérer les données Note : Prototype parlait de postBody, alors qu’on préferera requestBody
  • Rien de sorcier à implémenter du SOAP en JEE
  • Le Wsdl et le Xsd sont en principe générés par le logiciel. Le problème est qu’ils sont souvents obligatoire pour le bon déroulement de l’opération. Avec Jax-RS, tout est intégré à la même classe, en Java.
  • WSS permet notamment de vérifier que le message n’a pas changé
  • Ca marche, mais c’est un peu une boite noire.
  • En général, on utilise bien sûr un cookie
  • Cela ne résoud pas le problème du cache de l’ORM. C’est pourquoi les Gros poissons du Web utilisent REST, avec du NoSQL, et des données non critiques Tout se fait, mais parfois mal
  • Trop d’Ajax empêche le copié/collé ainsi que l’indexation par Google. De plus le Javascript et le contour est dans le cache.
  • Avec un support de session important, on va forcément planter si on n’a pas pris le bon chemin.
  • On pourra donc remplacer un composant par un autre sans se soucier du langage, de l’interface, du package, etc.
  • On peut considérer un Restlet comme une Servlet ou Socket n’autorisant que des bonnes pratiques Restful
  • L’autre avantage de Restlet est de bénéficier de la programmation Objet en permettant l’heritage des Composants (peut-on hériter de Jboss ?)
  • On s’attaque ensuite au serveur Mail, auquel on donne une interface uniforme
  • Il faut faire soi-même la gestion de l’autorisation value. Pour des vrais professionnels, ce ne doit pas être un problème.
  • REST JUG Toulouse 20100615

    1. 1. REST(ful) Services Web & Architecture Nicolas Zozol
    2. 2. Programme <ul><li>Présentation </li></ul><ul><ul><li>Définition </li></ul></ul><ul><ul><li>1er exemple </li></ul></ul><ul><ul><li>Intérêt </li></ul></ul><ul><li>Services Web </li></ul><ul><ul><li>Resource </li></ul></ul><ul><ul><li>Jax – Rs </li></ul></ul><ul><ul><li>Soap </li></ul></ul><ul><ul><li>RPC </li></ul></ul><ul><li>Architecture </li></ul><ul><ul><li>Restlet </li></ul></ul><ul><ul><li>Cloud </li></ul></ul><ul><ul><li>Sécurité </li></ul></ul><ul><ul><li>Transactions </li></ul></ul>
    3. 3. Définition : Bonnes Pratiques <ul><li>REpresentational State Transfer </li></ul><ul><li>HTTP </li></ul><ul><li>Bonnes Pratiques </li></ul><ul><ul><li>Tout est Res(s)ource </li></ul></ul><ul><ul><li>CRUD : Post, Get, Put, Delete </li></ul></ul><ul><ul><li>Stateless </li></ul></ul><ul><ul><li>Connectivité : < a href > => GET </li></ul></ul>
    4. 4. HTTP <ul><li>VERBE + URI </li></ul><ul><ul><li>PUT http://exemple.com/myApp/myResource </li></ul></ul><ul><li>Header </li></ul><ul><ul><li>ContentType : «  application/xml; UTF-8» </li></ul></ul><ul><ul><li>Authorization : Basic jhekalKslsal= </li></ul></ul><ul><li>RequestBody </li></ul><ul><ul><li><firstname>Bob</firstname> </li></ul></ul>
    5. 5. Requête DELETE
    6. 6. Réponse DELETE
    7. 7. Tout est Ressource … et URI
    8. 8. Resource 1..* Representation <ul><li><user> </li></ul><ul><ul><li><id>12</id><username> johndoe</username> </li></ul></ul><ul><ul><li></user> </li></ul></ul><ul><li>{user : {id:12, username: &quot;johndoe&quot; }} </li></ul>ContentType : application/xml, application/json, image/png Ou definir la representation : extjs/user
    9. 9. Décrire une URI <ul><li>URI = U niform R esource I dentifier </li></ul><ul><li>On accède à une Resource par son URI </li></ul><ul><li>On doit décoder cette URI </li></ul><ul><ul><li>Outil inclut : /school/teacher/{username} </li></ul></ul><ul><ul><li>Algorithme : GET /tarot/chien?atouts=6&excuse=true </li></ul></ul><ul><li>Une liste de Resource est une Resource </li></ul><ul><ul><li>/school/teachers/ </li></ul></ul><ul><li>Une Resource peut avoir plusieurs URI </li></ul><ul><ul><li>gwt.code.google.com/docs/2.1 </li></ul></ul><ul><ul><li>gwt.code.google.com/docs/latests </li></ul></ul>
    10. 10. Intérêts Immédiats <ul><li>Java connaît HTTP </li></ul><ul><li>Compatibilité : Embarqué => Cloud </li></ul><ul><li>HTTP 1.1 est un protocole stable </li></ul><ul><li>Une URI se copie/colle </li></ul><ul><li>Une URI est indexée par Google </li></ul><ul><li>HTTP est gratuit </li></ul><ul><li>Champion de la montée en charge </li></ul>
    11. 11. Intérêts Immédiats <ul><li>F U N </li></ul>
    12. 12. Web Services Vendre un accès à des données
    13. 13. Servlet classique
    14. 14. Appel Ajax : POST /rest/user <ul><li>new Ajax.Request( &quot;/rest/user&quot; , { </li></ul><ul><li>method: &quot;POST&quot; , </li></ul><ul><li>requestHeaders:{ </li></ul><ul><li>&quot;Authorization&quot; : &quot;BASIC FlorentjuG2=&quot; }, </li></ul><ul><li>postBody:  &quot;<username>Gaël</username>&quot; </li></ul><ul><li>onSuccess: function (response) { </li></ul><ul><li>alert(response.responseText); </li></ul><ul><li>}, </li></ul><ul><li>onException : function (response, ex){ </li></ul><ul><li>alert(response.responseText); </li></ul><ul><li>} </li></ul><ul><li>}); </li></ul>Ajout de l’utilisateur Gaël par Florent
    15. 15. Servlet classique < servlet > < servlet-name > PlainOldServlet </ servlet-name > < servlet-class > org.jug.toulouse.server.servlet.PlainOldServlet </ servlet-class > </ servlet > < servlet-mapping > < servlet-name > PlainOldServlet </ servlet-name > < url-pattern > / user </ url-pattern > </ servlet-mapping > Web.xml PlainOldServlet.java @Override protected void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String requestBody = FileUtilities.readInputStream( request.getInputStream() ); String username = new VsxJdom().getValue(requestBody, &quot;username&quot; ); User u = new UserCrud().create(username); //Business Code out.write( &quot;<root><id>&quot; +u.getId()+ &quot;</id></root>&quot; ); }
    16. 16. Servlet JAX-RS < servlet > < servlet-name > Jersey </ servlet-name > < servlet-class > com.sun.jersey.spi.container.servlet.ServletContainer </ servlet-class > </ servlet > < servlet-mapping > < servlet-name > Jersey </ servlet-name > < url-pattern > /rest/* </ url-pattern > </ servlet-mapping > Web.xml UserController.java : renvoit l’id du user <ul><li>@Path( &quot; / user &quot; ) </li></ul><ul><li>Class UserController extends JaxRsResourceController { </li></ul><ul><ul><li>@POST // For POST /myApp/rest/user </li></ul></ul><ul><ul><li>@Produces ( &quot;application/xml&quot; ) </li></ul></ul><ul><ul><li>protected Response addUSer ( String requestBody ) { </li></ul></ul><ul><ul><li>String username = new VsxJdom().getValue(requestBody, &quot;username&quot; ); </li></ul></ul><ul><ul><li>User u = new UserCrud().create(username); //Business Code </li></ul></ul><ul><ul><li>return getResponse( &quot;<root><id>&quot; +u.getId()+ &quot;</id></root>&quot; ); </li></ul></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    17. 17. SOAP
    18. 18. Requête Client Web
    19. 19. Travail Serveur (JEE 5&6)
    20. 20. Wsdl & Xsd
    21. 21. Wsdl & Xsd
    22. 22. REST vs SOAP <ul><li>HTTP </li></ul><ul><li>Interopérable </li></ul><ul><li>Verbe + URI </li></ul><ul><li>Sécurité : </li></ul><ul><ul><li>SSL+(Autorization/Cookie) </li></ul></ul><ul><li>Requêtes lisibles </li></ul><ul><li>Génération automatique du code Client possible (Rails, Play!) </li></ul><ul><li>Refactorisation simple, à la main </li></ul><ul><li>HTTP ; Open Standard, W3C </li></ul><ul><li>Intégré au « Produit » </li></ul><ul><li>POST + Méthode dans XML </li></ul><ul><li>Sécurité en « 1 clic » (WS-Security) </li></ul><ul><li>Requêtes complexes </li></ul><ul><li>Prévu pour la génération automatique du code Client </li></ul><ul><li>Refactorisation facile… ou horrible </li></ul>
    23. 23. RPC
    24. 24. Service RPC avec GWT
    25. 25. Service RPC avec GWT <ul><li>Debug </li></ul><ul><li>Interopérabilité </li></ul>
    26. 26. Service REST avec GWT <ul><li>Projet GWT-REST </li></ul><ul><li>Restlet </li></ul><ul><li>Robusta Web Library </li></ul>
    27. 27. Robusta Web Library avec GWT RestClientGwt client = new RestClientGwt(); CallbackBasic callback = new CallbackBasic(){ @Override public void onSuccess(AsynchronousRestClient client, String response) { try { userId = new VsxGwt().getNumber(response, &quot;idUser&quot; ); } catch (XmlException e) { onFailure(client, response); }}}; client. setNextRequestBody ( VsxBuilder. buildVerySimpleXml ( &quot;username&quot; , &quot;joedoe&quot; )); client. executePost ( &quot;/myApp/users&quot; ,null, callback);
    28. 28. Quels critères ?
    29. 29. Architecture REST SOA, ROA …
    30. 30. Jeu Statefull
    31. 31. Jeu Stateless
    32. 32. Avec Session
    33. 33. Sans Session
    34. 34. Restfull = StateLess <ul><li>Ou plus exactement : </li></ul><ul><li>L’état est contenu dans le Client </li></ul><ul><li>= La suite d’événement est (éventuellement) gérée par le navigateur </li></ul><ul><li>« La session, c’est mal » </li></ul><ul><li>Pourquoi ? </li></ul>
    35. 35. Cloud  Stateless
    36. 37. Connectivité <ul><li>Client lourd : </li></ul><ul><ul><li>1 point d’entrée : main (String [] args) </li></ul></ul><ul><li>Application Web : </li></ul><ul><ul><li>X points d’entrée : URI </li></ul></ul>
    37. 38. Connectivité  Stateless
    38. 39. google.com <=> google.com/ig <ul><li>/google.com/ </li></ul><ul><li>/google.com/ig </li></ul>
    39. 40. Architecture multiComposants
    40. 41. Interface Uniforme <ul><li>Quelque soit l’implémentation : </li></ul><ul><li>GET /mail </li></ul><ul><li>POST /mail </li></ul><ul><li><content>…</content> </li></ul><ul><li>DELETE /mail/contacts/johndoe </li></ul><ul><li>UPDATE /mail/contacts </li></ul><ul><li><user id= &quot;  johndoe &quot; >j.doe@gmail.com</user> </li></ul>
    41. 42. Restlet <ul><li>Simple executable </li></ul><ul><li>1 ligne Java </li></ul><ul><ul><li>new Server(Protocol.HTTP, 8182,Part03. class ).start(); </li></ul></ul><ul><li>10 serveurs = 10 lignes </li></ul>
    42. 43. Restlet
    43. 44. Restlet
    44. 45. Urbanisation
    45. 46. Urbanisation <ul><li>Mise à jour du Système d’Information sur plusieurs années, permettant des évolutions </li></ul><ul><li>Wikipédia : « L'urbanisme définit des règles ainsi qu'un cadre cohérent, stable et modulaire » </li></ul>
    46. 47. Urbanisation
    47. 48. WADL <ul><li>< resources base=&quot;http://api.search.yahoo.com/NewsSearchService/V1/&quot;>         < resource path=&quot;newsSearch&quot;>             < method name=&quot; GET &quot; id=&quot; search &quot;>                 <request>                     < param name=&quot;appid&quot; type=&quot;xsd:string&quot;                         style=&quot;query&quot; required=&quot;true&quot;/>                     <param name=&quot;query&quot; type=&quot;xsd:string&quot;                         style=&quot;query&quot; required=&quot;true&quot;/>                     <param name=&quot;type&quot; style=&quot;query&quot; default=&quot;all&quot;>                         <option value=&quot;all&quot;/> (…) </li></ul>
    48. 49. Sécurité & Transaction
    49. 50. BASIC Authentication <ul><li>HTTPS 1.1 </li></ul><ul><li>POST /mi5/login </li></ul><ul><li>Authorization : BASIC Base64(&quot;oss117:howisyourblanquette&quot;) </li></ul><ul><li><root> It's good </root> </li></ul>
    50. 51. Problème : le Pop-Up  De nombreuses solutions gèrent BASIC
    51. 52. La boite Login var username=$F(&quot;username&quot;), password=$F(&quot;password&quot;); var credential = robusta.Codec.encodeB64( username +&quot;:&quot;+robusta.Codec. md5 ( password ) ); var authorizationValue = &quot; BASIC &quot; + credential; new Ajax.Request(&quot;/mywebapp//login&quot;, { method: 'POST', requestHeaders:$H({ Authorization :authorizationValue}), onSuccess: function(transport) { ...} });
    52. 53. Transactions <ul><li>Pluisieurs écrans </li></ul><ul><li>Pas de session </li></ul><ul><li>Le client garde : </li></ul><ul><ul><li>L’autorisation </li></ul></ul><ul><ul><li>L’id de transaction (si possible) </li></ul></ul>
    53. 54. Transactions
    54. 55. Transactions <ul><li>Le client peut conserver l’ensemble des données necessaires : </li></ul><ul><ul><li>Autorisation </li></ul></ul><ul><ul><li>idTransaction </li></ul></ul><ul><ul><li>idAccounts Jo & Jack </li></ul></ul><ul><ul><li>Valeur de transfert </li></ul></ul><ul><ul><li>Le client garde des données ! </li></ul></ul>
    55. 56. Référence

    ×