32
Symfony2 & L’architecture REST Meilleurs pratiques

Symfony2 & l'architecture Rest

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Symfony2 & l'architecture Rest

Symfony2 & L’architecture RESTMeilleurs pratiques

Page 2: Symfony2 & l'architecture Rest

Ghali Ahmed formateur Symfony2

ghaliano2005

[email protected]

Page 3: Symfony2 & l'architecture Rest

ghaliano2005

[email protected]

Gérant de BesmartUne société qui developpe des applications autour de

symfony2

Page 4: Symfony2 & l'architecture Rest

ghaliano2005

[email protected]

Développeur de la plate-forme de pétitionwww.wesign.it

Page 5: Symfony2 & l'architecture Rest

http://developers.google.com/apis-explorer/

http://developer.yahoo.com/

http://developers.pinterest.com/

Page 6: Symfony2 & l'architecture Rest

“un style d’architecture pour les systèmes hypermédia distribués, créé par Roy Fielding

en 2000 dans le chapitre 5 de sa thèse de doctorat.”

REpresentational State Transfert

Transfert de la représentation “sans état” d’une ressource

Page 7: Symfony2 & l'architecture Rest

REST est un style d’architecture d’application

Page 8: Symfony2 & l'architecture Rest

REST n’impose pas un pattern (mvc, poo, ..) ou un langage de programmation

Page 9: Symfony2 & l'architecture Rest

Avec REST, on parle de la (les) Représentation(s) d’une ressource

Page 10: Symfony2 & l'architecture Rest

Mais c’est quoi une ressource ?

Hmm, et c’est quoi une ressource ?

Page 11: Symfony2 & l'architecture Rest

Une ressource est “un media” identifié & accessible à travers une URI enregistré sur un

serveurOn parle de ressource physique ou abstraite

Page 12: Symfony2 & l'architecture Rest

Exemple de ressource:

● Une image● Une vidéo● Un fichier pdf● Une ligne dans la base de donnée● le résultat d’un match de foot● le derniers billet d’un blog● …..

Page 13: Symfony2 & l'architecture Rest

REST impose des Contraintes d'architecture

Page 14: Symfony2 & l'architecture Rest

REST #1: client-serveur

Verbe http

L’URI de la ressource

l’entête la plus importante: l’adresse du serveur

Version du protocole http

Le mime type de la requête

GET /book/1 HTTP/1.0Host: fr.wikipedia.orgContent-Type: application/json

La requette (Request)

Page 15: Symfony2 & l'architecture Rest

REST #1: client-serveur

Statut de la réponse

l’entête : taille de la réponse en octet

Version du protocole http

HTTP/1.0 200 OKContent-Type : text/HTML Content-Length : 1245 ….

“Le contenu de la page wiki de symfony”

La réponse (Response)

“” Le contenu de la réponse

Le type de media (mime type)

Page 16: Symfony2 & l'architecture Rest

GET 200 (OK). 404 (Not Found), si l’identifiant introuvable ou invalide.

PUT 200 (OK) or 204 (No Content). 404 (Not Found), si l’identifiant introuvable ou invalide

POST 404 (Not Found).

DELETE 200 (OK). 404 (Not Found), si l’identifiant introuvable ou invalide.

Les verbes HTTP populaires

Page 17: Symfony2 & l'architecture Rest

REST: #2( requette sans sauvegarde d’état )

Page 18: Symfony2 & l'architecture Rest

REST: #3Mise en cache

Page 19: Symfony2 & l'architecture Rest

REST: #4

Une interface uniforme

L'identification des ressources représentations Un message auto-

descriptif

Hypermédia comme moteur

d'état de l'application

Page 20: Symfony2 & l'architecture Rest

REST: #5Systême hiérarchisé par couche

Page 21: Symfony2 & l'architecture Rest

REST: #6Code on demande (optional)

Page 22: Symfony2 & l'architecture Rest

REST & symfony2

Page 23: Symfony2 & l'architecture Rest

REST & php natif

$uri = $_SERVER['REQUEST_URI'];$title = $_GET['title'];

headr('Content-type: text/html');echo 'L\'URI demandée est: ' . $uri;echo 'La valeur du paramètre "title" est: ' . $title;

Page 24: Symfony2 & l'architecture Rest

REST & symfony2Un framework conçue autour du protocole http

Request

<?php…use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;

class BookController extends Controller{

public function getBooksAction(){

$request = Request::createFromGlobals();$request->query->get('title');$request->headers->get('content_type');$request->getMethod();

$response = new Response();$response->setContent('<html><body><h1>Voici une liste de livre</h1></body></html>');$response->setStatusCode(200);$response->headers->set('Content-Type', 'text/html');

$response->send();}

}

Request access

Response manipulation

Page 25: Symfony2 & l'architecture Rest

REST & symfony2REST recommandation:

Architecturer les URI (les identifiants des ressources)

avant de commencer le développement

Page 26: Symfony2 & l'architecture Rest

Fonctionnalité HTTP Verb URI

Afficher tous les livres GET http://gestbook.com/books

Afficher un livre GET http://gestbook.com/book/1

Modifier un livre POST http://gestbook.com/book/1

Supprimer un livre DELETE http://gestbook.com/book/1

Page 27: Symfony2 & l'architecture Rest

REST & symfony2

1. composer create-project symfony/framework-standard-edition rest 2.3.0

2. composer require friendsofsymfony/rest-bundle @stable

3. composer require jms/serializer-bundle @stable

4. composer require nelmio/api-doc-bundle @stable

5. Activer les bundles dans /app/AppKernel.php

Préparer l’environnement

Page 28: Symfony2 & l'architecture Rest

REST & symfony2#/app/config/config.ymlfos_rest:

param_fetcher_listener: forcebody_listener: trueformat_listener:

rules: - { path: '^/api/', priorities: ['xml', 'json'], fallback_format: json, prefer_extension: false } - { path: '^/image', priorities: ['jpeg', 'gif'], fallback_format: false, prefer_extension: true } - { path: '^/admin', priorities: [ 'xml', 'html'], fallback_format: ~, prefer_extension: false } - { path: '^/', priorities: [ 'html', '*/*'], fallback_format: html, prefer_extension: true }

view:

view_response_listener: true

Configurer FOSRestBundle

Page 29: Symfony2 & l'architecture Rest

REST & symfony2

#/app/config/routing.yml

symfony_tn_book:

resource: "@SymfonyTNBookBundle/Controller/"

type: rest

prefix: /api/

Configurer FOSRestBundle

Page 30: Symfony2 & l'architecture Rest

REST & symfony2<?phpnamespace SymfonyTN\BookBundle\Controller;

use FOS\RestBundle\Controller\FOSRestController as Controller;use FOS\RestBundle\Controller\Annotations\View;use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

class BooksController extends Controller{ /** * @View * @Route("/ebooks", defaults={"_format" = "json"}) */

public function getBooksAction(){

return ['name' => 'symfony-tn'];}

}

Un simple controlleur utilisant les helpers FosRest

Page 32: Symfony2 & l'architecture Rest

Merci pour ce merveilleux moment partagé ensemble