Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

REST JUG Toulouse 20100615

3,473 views

Published on

Published in: Technology
  • Be the first to comment

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

×