Services Web SOAP & REST avec symfony



Documents pareils
4. SERVICES WEB REST 46

Applications et Services WEB: Architecture REST

les techniques d'extraction, les formulaires et intégration dans un site WEB

COMPRENDRE L ARCHITECTURE DES WEB SERVICES REST. Amosse EDOUARD, Doctorant

TP JAVASCRIPT OMI4 TP5 SRC

Par l'exemple de. Laurent Destailleur

(structure des entêtes)

Architectures Web Services RESTful

Principales failles de sécurité des applications Web Principes, parades et bonnes pratiques de développement

Bien architecturer une application REST

Alfstore workflow framework Spécification technique

Sécurité des sites Web Pas un cours un recueil du net. INF340 Jean-François Berdjugin

Drupal un CMS orienté mé2er. Romain JARRAUD Mathieu GROS

WEB & DÉVELOPPEMENT LES BASES DU WEB LE LANGAGE HTML FEUILLES DE STYLES CSS HISTORIQUE D INTERNET ET DU WEB LES DIFFÉRENTS LANGAGES

Devenez un véritable développeur web en 3 mois!

Introduction à ElasticSearch

Présentation du relais HTTP Open Source Vulture. Arnaud Desmons Jérémie Jourdin

PHP. Bertrand Estellon. 26 avril Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril / 214

Construire un réseau social avec Symfony Xavier Lacot Clever Age. Symfony Live 11 et 12 juin 2009 Clever Age Xavier Lacot

3 chapitre Groupe Eyrolles, 2008

Gilles.Roussel univ-mlv.fr HTTP/1.1 RFC 2068

Architecture Orientée Service, JSON et API REST

Application Web et J2EE

Hébergement de site web Damien Nouvel

Petite définition : Présentation :

Développement d'applications Web HTML5 L'art et la manière avec Visual Studio 2015 et TFS

S7 Le top 10 des raisons d utiliser PHP pour moderniser votre existant IBM i

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Pratique et administration des systèmes

DOM - Document Object Model

Mysql. Les requêtes préparées Prepared statements

Gestion centralisée d un réseau de sites discrets. Nicolas JEAN

Nouveautés de Drupal 8. Léon

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

THÉMATIQUES. Comprendre les frameworks productifs. Découvrir leurs usages. Synthèse

Configurer le Serveur avec une adresse IP Statique (INTERFACE :FastEthernet) : et un masque

Cursus Sage ERP X3 Outils & Développement. Le parcours pédagogique Sage ERP X3 Outils et Développement

Bonnes pratiques de développement JavaScript

Technologies pour Web Services faciles : REST, JSON

Les Architectures Orientées Services (SOA)

API ONE-TIME PASSWORD

Manuel d intégration API SOAP SMS ALLMYSMS.COM

Module BD et sites WEB

Impact des robots d indexation sur le cache de second niveau de SPIP IMBERTI Christophe - SG/SPSSI/CP2I/DO Ouest 06/06/2012 mis à jour le 05/07/2012

>>>>>>>>>> roger atasi <<<<<<<<<<<<<<< chez , boulevard Victor Hugo Clichy - Tél :

Le Web de Données Dan VODISLAV Université de Cergy-Pontoise Master Informatique M2 Plan

Développer des Applications Internet Riches (RIA) avec les API d ArcGIS Server. Sébastien Boutard Thomas David

«Cachez-moi cette page!»

Programmation Web. Madalina Croitoru IUT Montpellier

Les solutions de paiement CyberMUT (Crédit Mutuel) et CIC. Qui contacter pour commencer la mise en place d une configuration de test?

CAS, la théorie. R. Ferrere, S. Layrisse

PHP. PHP et bases de données

Proxies,, Caches & CDNs

OpenPaaS Le réseau social d'entreprise

Intégration e-commerce. Version 0.5

INGÉNIEUR - DÉVELOPPEUR EXPÉRIMENT É PHP. 27 ans - 6 ans d'expérience

Technologies Web. Ludovic Denoyer Sylvain Lamprier Mohamed Amine Baazizi Gabriella Contardo Narcisse Nya. Université Pierre et Marie Curie

L3 informatique TP n o 2 : Les applications réseau

Sécurité des applications web. Daniel Boteanu

Sécurité des Web Services (SOAP vs REST)

Tessi Documents Services ASPONE. Démo Webservices UpValue.

PHP et les Bases de données - Généralités

Les frameworks, essentiels dans l'écosystème PHP

Développement d'un logiciel VoIP BlackBerry

Soon_AdvancedCache. Module Magento SOON. Rédacteur. Relecture & validation technique. Historique des révisions

Configurer la supervision pour une base MS SQL Server Viadéis Services

Formation en Logiciels Libres. Fiche d inscription

FileMaker Server 14. Guide de démarrage

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Tech-Evenings Sécurité des applications Web Sébastien LEBRETON

BES WEBDEVELOPER ACTIVITÉ RÔLE

Paris Airports - Web API Airports Path finding

Dans l'article précédent, vous avez appris

VXPERT SYSTEMES. CITRIX NETSCALER 10.1 et SMS PASSCODE 6.2. Guide d installation et de configuration pour Xenapp 6.5 avec SMS PASSCODE 6.

INTERNET est un RESEAU D ORDINATEURS RELIES ENTRE EUX A L ECHELLE PLANETAIRE. Internet : interconnexion de réseaux (anglais : net = réseau)

HTTP HTTP. IUT1 dpt SRC L Isle d Abeau Jean-françois Berdjugin. Introduction et architecture Messages Authentification Conclusion

Mise en place d un serveur Proxy sous Ubuntu / Debian

Point sur les solutions de développement d apps pour les périphériques mobiles

INTRODUCTION À PYRAMID Gaël Bearstech. Crédits: Blaise Laflamme

VoD ( Video on Demand ) avec VLC

Cours Master Recherche RI 7 Extraction et Intégration d'information du Web «Services Web»

The Book for Symfony 2.1

Intégration de systèmes

Les services usuels de l Internet

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Stockage du fichier dans une table mysql:

Cours Plugin Eclipse. Université Paris VI / Parcours STL / Master I Pierre-Arnaud Marcelot - Iktek - pamarcelot@iktek.com

NFA016 : Introduction. Pour naviguer sur le Web, il faut : Naviguer: dialoguer avec un serveur web

Les grandes facettes du développement Web Nicolas Thouvenin - Stéphane Gully

Rapport de stage Clément MOYSAN

Comprendre et optimiser la base de données WordPress WP TECH 2014

PHP 5.4 Développez un site web dynamique et interactif

PHP 4 PARTIE : BASE DE DONNEES

Objectif : Passer de l analyse métier et fonctionnelle à la définition des applications qui

Architectures web/bases de données

Auteur LARDOUX Guillaume Contact Année 2014 DEVELOPPEMENT MOBILE AVEC CORDOVA

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Transcription:

Services Web SOAP & REST avec symfony RMLL - 6 juillet 2010

Qui suis-je? Hugo HAMON Responsable des formations chez Sensio Labs Coauteur et contributeur d ouvrages Secrétaire Général de l AFUP Webmaster du site Apprendre-PHP.com

Introduction aux Web services

Les services web Programmes destinés à échanger des données entre systèmes hétérogènes Basés sur des standards (SOAP) ou des styles d architecture (REST) Fonctionnent en mode Client / Serveur (requête / réponse) Echange de données préformattées (XML, JSON, YAML, HTML, PDF...) Client / Server modes - Request / response exchanges Faible couplage grâce aux standards ouverts comme XML Faciles à mettre en oeuvre

Architecture REST

REST c est quoi? REpresentational State Transfert Concept inventé par Roy Fielding en 2000 REST est un style d architecture! REST s appuie sur les concepts suivants : Le protocole HTTP (requête / réponse) La notion d URI qui identifie chaque ressource Les méthodes HTTP (GET, POST, PUT, DELETE, HEAD) Les codes de statut (200, 201, 403, 404, 500...) Les formats ouverts (XML, JSON, HTML...) REST est simple à mettre en oeuvre

La notion d URI Chaque URI identifie une ressource http://api.domain.com/users/hugo Une URI ne contient pas de verbe! Une même URI peut être appelée avec différentes méthodes HTTP GET http://api.domain.com/users Récupère les utilisateurs POST http://api.domain.com/users Crée un nouvel utilisateur

Les méthodes HTTP GET, POST, PUT, DELETE et HEAD Identifient les actions réalisables sur la ressource GET http://api.domain.com/users Récupère les utilisateurs POST http://api.domain.com/users Crée un nouvel utilisateur PUT http://api.domain.com/users/hugo Modifie hugo DELETE http://api.domain.com/users/hugo Supprime hugo Opérations CRUD sur les ressources

Les codes HTTP de retour Indiquent l état (succès ou échec) de l opération effectuée Méthodes En cas de succès En cas d échec POST 201 Created Redirection vers l URI de l objet 400 Bad Request PUT DELETE 200 OK 200 OK 400 Bad Request 404 Not Found 409 Conflict 400 Bad Request 404 Not Found 410 Gone GET 200 OK 400 Bad Request 404 Not Found

Symfony un framework RESTfull

Introduction

Présentation de symfony Framework PHP 5 MVC Open Source «full stack» Rapid Application Development Publié en 2005 sous licence MIT Bâti pour répondre à des besoins complexes Utilise les «best practices» (design patterns, mvc, tests unitaires...) Maintenu par Sensio Labs jusqu à fin 2012 Documentation riche et Open Source (4 livres officiels) Communauté très active

Outillage de symfony Architecture MVC Propel et Doctrine (DBAL / ORM) Génération de code (CRUD et Admin Generator) Plugins et configurabilité Routing (URLs élégantes) I18N et L10N (monnaie, nombres, traductions...) Tests unitaires et fonctionnels Interface en ligne de commande ACL et cache des pages HTML...

Un routing RESTFull

Contraindre les routes aux méthodes HTTP L objet sfrequestroute permet de contraindre les URI aux méthodes HTTP user_edit: class: sfrequestroute url: /api/users/:username param: { module: user, action: update } requirements: { sf_method: put }

Contraindre les routes aux méthodes HTTP La commande app:routes affiche la définition des URIs de l application

Contraindre les routes aux méthodes HTTP Symfony simule les requêtes PUT et DELETE depuis un navigateur Les formulaires embarquent un champ caché «sf_method» <form action="/api_dev.php/api/user/hugo" method="post"> <input type="hidden" value="put" name="sf_method"/> <input type="hidden" id="rmll_user_id" value="2" name="rmll_user[id]"/> <input type="hidden" id="rmll_user csrf_token" value="94c132e7c771411590124aea52bb9d4f" name="rmll_user[_csrf_token]"/> <!--... --> </form>

Contraindre les routes aux méthodes HTTP Les liens de suppression génère un formulaire à la volée Celui-ci embarque un jeton unique et le paramètre sf_method <li class="sf_admin_action_delete"><a href="/api_dev.php/api/user/hugo" onclick="if (confirm('are you sure?')) { var f = document.createelement ('form'); f.style.display = 'none'; this.parentnode.appendchild(f); f.method = 'post'; f.action = this.href;var m = document.createelement ('input'); m.setattribute('type', 'hidden'); m.setattribute('name', 'sf_method'); m.setattribute('value', 'delete'); f.appendchild(m);var m = document.createelement('input'); m.setattribute('type', 'hidden'); m.setattribute('name', '_csrf_token'); m.setattribute('value', 'f0271a52cca50e62df7deb1568f80489'); f.appendchild(m);f.submit (); };return false;">supprimer</a></li>

Les routes d objets Utilisent la classe sfdoctrineroute ou sfpropelroute Permettent de lier une route à un objet de modèle Doctrine / Propel user_edit: class: sfdoctrineroute url: /api/users/:username param: { module: user, action: update } options: { model: RmllUser, column: username, type: object } requirements: { sf_method: put }

Les routes d objets public function executeupdate(sfwebrequest $request) { $user = $this->getroute()->getobject(); $form = new RmllUserForm($user, array(), false); $form->bind($request->getparameter('rmll_user')); $status = 400; if ($form->isvalid()) { $form->save(); $status = 200; } } $this->getresponse()->setstatuscode($status); return sfview::none;

Les collections de routes d objets Utilisent la classe sfdoctrineroutecollection ou sfpropelroutecollection Permettent de lier plusieurs routes à un objet de modèle Doctrine / Propel user: class: sfdoctrineroutecollection options: model: RmllUser module: user prefix_path: /api/users column: username with_wildcard_routes: true actions: [list, create, update, delete, show]

Les collections de routes d objets

Support des formats de sortie

Support des formats de sortie Par défaut, symfony supporte le format HTML Le paramètre «sf_format» définit le format de sortie Symfony se charge d envoyer les bons en-têtes en fonction de l extension user: class: sfdoctrineroutecollection options: model: RmllUser module: user prefix_path: /api/users column: username with_wildcard_routes: true actions: [list, create, update, delete, show] requirements: { sf_format: (?:html xml json) }

<h1><?php echo $user?></h1> <table> <tbody> <tr> <td>username</td> <td><?php echo $user->getusername()?></td> </tr> <tr> <td>password</td> <td><?php echo $user->getpassword()?></td> </tr> <tr> <td>first name</td> <td><?php echo $user->getfirstname()?></td> </tr> <tr> <td>last name</td> <td><?php echo $user->getlastname()?></td> </tr> <tr> <td>birthdate</td> <td><?php echo $user->getbirthdate()?></td> </tr> </tbody> </table> showsuccess.php

Le template showsuccess.xml.php génère la sortie XML <?php echo '<?xml version="1.0" encoding="utf-8"?>'."\n"?> <user> <username><?php echo $user->getusername()?></username> <firstname><?php echo $user->getfirstname()?></firstname> <lastname><?php echo $user->getlastname()?></lastname> <birthdate><?php echo $user->getbirthdate()?></birthdate> </user>

Le template showsuccess.json.php génère la sortie JSON { } "username": <?php echo json_encode($user->getusername())?>, "firstname": <?php echo json_encode($user->getfirstname(esc_raw))?>, "lastname": <?php echo json_encode($user->getlastname(esc_raw))?>, "birthdate": <?php echo json_encode($user->getbirthdate())."\n"?>

Sortie HTML Sortie XML Sortie JSON

Cache des résultats

Cache des résultats Symfony dispose nativement d un cache HTML des pages Chaque sortie générée peut être mise en cache sur le serveur La durée de vie du cache de chaque page est configurable Le cache est par défaut stocké sur le système de fichier (sffilecache) Symfony offre la possibilité de choisir où stocker le cache : Fichiers (sffilecache) SQLite (sfsqlitecache) XCache (sfxcachecache) MemCache (sfmemcachecache) APC... (sfapccache)

Cache des résultats Configuration du cache dans apps/api/modules/user/config/cache.yml show: enabled: true with_layout: true lifetime: 3600

Avant la mise en cache 336 ms

Après la mise en cache 50 ms

Tests Fonctionnels de l API

Simuler des requêtes GET include(dirname( FILE ).'/../../bootstrap/functional.php'); $browser = new RmllTestFunctional(new sfbrowser()); $browser->loadfixtures(); $browser-> get('/api/users/hhamon.xml')-> with('request')->begin()-> isformat('xml')-> isparameter('module', 'user')-> isparameter('action', 'show')-> end()-> with('response')->begin()-> isstatuscode(200)-> isvalid()-> end();

Simuler des requêtes GET

Simuler des requêtes POST $user = array( 'username' => 'pmartin', 'password' => 'something', 'first_name' => 'Paul', 'last_name' => 'Martin' ); $user = getuser(array('birthdate' => '')); $browser-> post('/api/users', array('rmll_user' => $user))-> with('response')->isstatuscode(400); $browser-> post('/api/users', array('rmll_user' => getuser()))-> with('response')->begin()-> isstatuscode(201)-> isredirected()-> end()-> followredirect()

Simuler des requêtes POST

Simuler des requêtes PUT $user = getuser(array('first_name' => 'Toto')); $browser-> call('/api/users/pmartin', 'put', array('rmll_user' => $user))-> with('response')->isstatuscode(200) ;

Simuler des requêtes DELETE $browser-> call('/api/users/pmartin', 'delete')-> with('response')->isstatuscode(200);

Démonstration

Architecture SOAP