Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

REST JUG Toulouse 20100615

  • Sé el primero en comentar

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

×