Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Services REST et Open Data

Services REST et Open Data

Benjamin Grandfond

November 29, 2012
Tweet

More Decks by Benjamin Grandfond

Other Decks in Programming

Transcript

  1. Benjamin Grandfond Benjamin Grandfond - PHP Tour Nantes 2012 Technical

    Team Manager @benjaM1 @benja-M-1 jeudi 29 novembre 12
  2. Benjamin Grandfond - PHP Tour Nantes 2012 Architectures • SOAP

    • XML-RPC • URL unique • POX (Plain Old XML) jeudi 29 novembre 12
  3. Benjamin Grandfond - PHP Tour Nantes 2012 Architectures https://api.bf.com/createOrder?burger=doublecheese&fries=true&drink=coca https://api.bf.com/payOrder?id=1234&cardHolderName=Benjamin%20

    Grandfond&cardNumber=11223344556677&cardSecuredNumber=123&expiryMonth=11& expiryDay=21 • multiples URL • un seul verbe HTTP (POST) jeudi 29 novembre 12
  4. Benjamin Grandfond - PHP Tour Nantes 2012 Richardson Maturity Model

    Niveaux 0 et 1 http://martinfowler.com/articles/richardsonMaturityModel.html jeudi 29 novembre 12
  5. Benjamin Grandfond - PHP Tour Nantes 2012 Benjamin Grandfond -

    PHP Tour Nantes 2012 ~Xavur deviantart jeudi 29 novembre 12
  6. Benjamin Grandfond - PHP Tour Nantes 2012 Benjamin Grandfond -

    PHP Tour Nantes 2012 Roy T. Fielding http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm jeudi 29 novembre 12
  7. Benjamin Grandfond - PHP Tour Nantes 2012 Définitions • ressource

    : tout document exposé sur le web • représentation : vue d’une ressource à un instant t dans n’importe quel format (JSON, XML, HTML ...) jeudi 29 novembre 12
  8. Benjamin Grandfond - PHP Tour Nantes 2012 Rappel • le

    web est composé de liens entre différentes ressources • le web utilise le protocol HTTP jeudi 29 novembre 12
  9. Benjamin Grandfond - PHP Tour Nantes 2012 Contraintes • Client

    - Serveur • Stateless • Cacheable • Code On Demand (optionelle) • Interface uniforme jeudi 29 novembre 12
  10. Benjamin Grandfond - PHP Tour Nantes 2012 Interface uniforme ?!

    • une URI identifie une ressource • manipulation par représentation • les headers HTTP définissent les opérations, les autorisations, le format de la réponse, etc ... • représentation avec hypermedias jeudi 29 novembre 12
  11. Benjamin Grandfond - PHP Tour Nantes 2012 Client Serveur doublecheese,

    frite coca commande 1234 coûte 12€ voilà 12€ voilà la facture voilà votre commande quelques minutes plus tard merci ! 1 2 3 4 5 6 jeudi 29 novembre 12
  12. POST /orders HTTP/1.1 Host: api.bf.com Accept: application/xml Content-Type: application/xml <?xml

    version="1.0" encoding="utf-8" ?> <order> <burger>doublecheese</burger> <side_order>fries</side_order> <drink>coca</drink> </order> Benjamin Grandfond - PHP Tour Nantes 2012 Request 1 jeudi 29 novembre 12
  13. HTTP/1.1 201 Created Allow: DELETE, GET, PUT Content-Type: application/xml Location:

    https://api.bf.com/orders/1234 <?xml version="1.0" encoding="utf-8" ?> <order> <id>1234</id> <burger>doublecheese</burger> <side_order>fries</side_order> <drink>coca</drink> <amount>12.00</amount> <state>pending payment</state> </order> Benjamin Grandfond - PHP Tour Nantes 2012 Response 2 jeudi 29 novembre 12
  14. POST /payments HTTP/1.1 Host: api.bf.com Content-Type: application/xml <?xml version="1.0" encoding="utf-8"

    ?> <payment> <order>1234</order> <amount>12.00</amount> <cardHolderName>Benjamin Grandfond</cardHolderName> <cardNumber>11223344556677</cardNumber> <cardSecuredNumber>123</cardSecuredNumber> <expiryMonth>11</expiryMonth> <expiryYear>2013</expiryYear> </payment> Benjamin Grandfond - PHP Tour Nantes 2012 Request 3 jeudi 29 novembre 12
  15. HTTP/1.1 201 Created Allow: GET Content-Type: application/xml Location: https://api.bf.com/receipts/1234 <?xml

    version="1.0" encoding="utf-8" ?> <receipt> <payment>1234</payment> <order>1234</order> <amount>12.00</amount> <paid>2012-11-04 17:53:42</paid> </receipt> Benjamin Grandfond - PHP Tour Nantes 2012 Response 4 jeudi 29 novembre 12
  16. PUT /orders/1234 HTTP/1.1 Host: api.bf.com Content-Type: application/xml <?xml version="1.0" encoding="utf-8"

    ?> <order> <id>1234</id> <burger>doublecheese</burger> <side_order>fries</side_order> <drink>coca</drink> <amount>12.00</amount> <state>delivered</state> </order> Benjamin Grandfond - PHP Tour Nantes 2012 Request 5 jeudi 29 novembre 12
  17. PATCH /orders/1234 HTTP/1.1 Host: api.bf.com Content-Type: application/xml <?xml version="1.0" encoding="utf-8"

    ?> <order> <state>delivered</state> </order> Benjamin Grandfond - PHP Tour Nantes 2012 Request 5 jeudi 29 novembre 12
  18. HTTP/1.1 200 Ok Host: api.bf.com Content-Type: application/xml <order> <id>1234</id> <burger>doublecheese</burger>

    <side_order>fries</side_order> <drink>coca</drink> <amount>12.00</amount> <state>delivered</state> </order> Benjamin Grandfond - PHP Tour Nantes 2012 Response 6 jeudi 29 novembre 12
  19. Benjamin Grandfond - PHP Tour Nantes 2012 Méthodes HTTP GET

    (sans risque, idempotent) POST (risqué, pas idempotent) PUT & DELETE (risqué, idempotent) jeudi 29 novembre 12
  20. Benjamin Grandfond - PHP Tour Nantes 2012 Codes retours HTTP

    200 OK (GET, PUT, DELETE) 201 Created (POST) 204 No Content (PUT, DELETE) 400 Bad Request (POST) 404 Not Found (GET, PUT, DELETE) 405 Method Not Allowed (PUT, DELETE) 409 Conflict (PUT) 500 Internal Server Error (GET, POST, PUT) 503 Service Unavailable (DELETE) jeudi 29 novembre 12
  21. Niveau 2 du RMM Benjamin Grandfond - PHP Tour Nantes

    2012 c’est déjà pas mal ;) jeudi 29 novembre 12
  22. Benjamin Grandfond - PHP Tour Nantes 2012 Benjamin Grandfond -

    PHP Tour Nantes 2012 HATEOAS «Hypermedia as the engine of the application state» Roy T. Fielding jeudi 29 novembre 12
  23. Benjamin Grandfond - PHP Tour Nantes 2012 Interface uniforme ?!

    • une URI identifie une ressource • manipulation par représentation • les headers HTTP définissent les opérations, les autorisations, le format de la réponse, etc ... • représentation avec hypermedias jeudi 29 novembre 12
  24. Benjamin Grandfond - PHP Tour Nantes 2012 Benjamin Grandfond -

    PHP Tour Nantes 2012 Ce sont des liens* qui permettent au client de changer l’état de l’application à un instant t. Hypermedia ? * les formulaires sont aussi des hypermedias ! jeudi 29 novembre 12
  25. Benjamin Grandfond - PHP Tour Nantes 2012 Benjamin Grandfond -

    PHP Tour Nantes 2012 Format XHTML est un format supportant les hypermedias interprété par les navigateurs ATOM est un format supportant les hypermedias interprété par les feed readers jeudi 29 novembre 12
  26. Benjamin Grandfond - PHP Tour Nantes 2012 Benjamin Grandfond -

    PHP Tour Nantes 2012 Format sur mesure HTTP/1.1 200 OK Allow: DELETE, GET Content-Type: application/xml <?xml version="1.0" encoding="utf-8" ?> <order> <id>1234</id> <burger>doublecheese</burger> <side_order>fries</side_order> <drink>coca</drink> <amount>12.00</amount> <state>delivered</state> </order> jeudi 29 novembre 12
  27. Benjamin Grandfond - PHP Tour Nantes 2012 Benjamin Grandfond -

    PHP Tour Nantes 2012 Format sur mesure HTTP/1.1 200 OK Allow: DELETE, GET Content-Type: application/xml <?xml version="1.0" encoding="utf-8" ?> <order xmlns="urn:com.bf.orders" xmlns:bf="http://schemas.bf.com/definitions/bf"> <id>1234</id> <burger>doublecheese</burger> <side_order>fries</side_order> <drink>coca</drink> <amount>12.00</amount> <state>delivered</state> </order> Définition des namespaces jeudi 29 novembre 12
  28. Benjamin Grandfond - PHP Tour Nantes 2012 Benjamin Grandfond -

    PHP Tour Nantes 2012 Format sur mesure HTTP/1.1 200 OK Allow: DELETE, GET Content-Type: application/xml <?xml version="1.0" encoding="utf-8" ?> <order xmlns="urn:com.bf.orders" xmlns:bf="http://schemas.bf.com/definitions/bf"> <id>1234</id> <bf:link rel="self" href="http://api.bf.com/orders/1234"/> <burger>doublecheese</burger> <side_order>fries</side_order> <drink>coca</drink> <amount>12.00</amount> <state>delivered</state> </order> Lien vers la commande elle-même jeudi 29 novembre 12
  29. Benjamin Grandfond - PHP Tour Nantes 2012 Benjamin Grandfond -

    PHP Tour Nantes 2012 Format sur mesure HTTP/1.1 200 OK Allow: DELETE, GET Content-Type: application/xml <?xml version="1.0" encoding="utf-8" ?> <order xmlns="urn:com.bf.orders" xmlns:bf="http://schemas.bf.com/definitions/bf"> <id>1234</id> <bf:link rel="self" href="http://api.bf.com/orders/1234"/> <bf:link rel="http://schemas.bf.com/relations/burger" href="http://api.bf.com/burgers/doublecheese"> <side_order>fries</side_order> <drink>coca</drink> <amount>12.00</amount> <state>delivered</state> </order> Lien vers le burger commandé jeudi 29 novembre 12
  30. Benjamin Grandfond - PHP Tour Nantes 2012 Benjamin Grandfond -

    PHP Tour Nantes 2012 Format sur mesure HTTP/1.1 200 OK Allow: DELETE, GET Content-Type: application/xml <?xml version="1.0" encoding="utf-8" ?> <order xmlns="urn:com.bf.orders" xmlns:bf="http://schemas.bf.com/definitions/bf"> <id>1234</id> <bf:link rel="self" href="http://api.bf.com/orders/1234"/> <bf:link rel="http://schemas.bf.com/relations/burger" href="http://api.bf.com/burgers/doublecheese"> <bf:link rel="http://schemas.bf.com/relations/side-order" href="http://api.bf.com/side-orders/fries"> <drink>coca</drink> <amount>12.00</amount> <state>delivered</state> </order> Lien vers l’accompagnement jeudi 29 novembre 12
  31. Benjamin Grandfond - PHP Tour Nantes 2012 Benjamin Grandfond -

    PHP Tour Nantes 2012 Format sur mesure HTTP/1.1 200 OK Allow: DELETE, GET Content-Type: application/xml <?xml version="1.0" encoding="utf-8" ?> <order xmlns="urn:com.bf.orders" xmlns:bf="http://schemas.bf.com/definitions/bf"> <id>1234</id> <bf:link rel="self" href="http://api.bf.com/orders/1234"/> <bf:link rel="http://schemas.bf.com/relations/burger" href="http://api.bf.com/burgers/doublecheese"> <bf:link rel="http://schemas.bf.com/relations/side-order" href="http://api.bf.com/side-orders/fries"> <bf:link rel="http://schemas.bf.com/relations/drink" href="http://api.bf.com/drinks/coca"> <amount>12.00</amount> <state>delivered</state> </order> Lien vers la boisson jeudi 29 novembre 12
  32. HTTP/1.1 200 OK Allow: DELETE, GET Content-Type: application/vnd.bf.com+xml <?xml version="1.0"

    encoding="utf-8" ?> <order xmlns="urn:com.bf.orders" xmlns:bf="http://schemas.bf.com/definitions/bf"> <id>1234</id> <bf:link rel="self" href="http://api.bf.com/orders/1234"/> <bf:link rel="http://schemas.bf.com/relations/burger" href="http://api.bf.com/burgers/doublecheese"> <bf:link rel="http://schemas.bf.com/relations/side-order" href="http://api.bf.com/side-orders/fries"> <bf:link rel="http://schemas.bf.com/relations/drink" href="http://api.bf.com/drinks/coca"> <amount>12.00</amount> <state>delivered</state> </order> Benjamin Grandfond - PHP Tour Nantes 2012 Benjamin Grandfond - PHP Tour Nantes 2012 Media Type Définition d’un contrat entre client et serveur jeudi 29 novembre 12
  33. Benjamin Grandfond - PHP Tour Nantes 2012 Benjamin Grandfond -

    PHP Tour Nantes 2012 Niveau 3 du RMM Hypermedia jeudi 29 novembre 12
  34. Benjamin Grandfond - PHP Tour Nantes 2012 ✔ GET, POST,

    PUT, DELETE ✔ PATCH, HEAD, OPTIONS Interface uniforme ? jeudi 29 novembre 12
  35. Benjamin Grandfond - PHP Tour Nantes 2012 ✔ Codes HTTP

    Interface uniforme ? # Symfony/Component/HttpFoundation/Response.php public static $statusTexts = array( 200 => 'OK', 201 => 'Created', ... 204 => 'No Content', ... 304 => 'Not Modified', ... 400 => 'Bad Request', 401 => 'Unauthorized', ... 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', ... 409 => 'Conflict', ... 415 => 'Unsupported Media Type', ... 500 => 'Internal Server Error', ... 503 => 'Service Unavailable' ... jeudi 29 novembre 12
  36. Benjamin Grandfond - PHP Tour Nantes 2012 ✔ FOSRestBundle URL

    hiérarchisées ? https://github.com/FriendsOfSymfony/FOSRestBundle/blob/master/Resources/doc/ 5-automatic-route-generation_single-restful-controller.md#define-resource-actions jeudi 29 novembre 12
  37. Benjamin Grandfond - PHP Tour Nantes 2012 URL hiérarchisées ?

    "get_users" [GET] /users "post_users" [POST] /users "get_user" [GET] /users/{slug} "put_user" [PUT] /users/{slug} "patch_user" [PATCH] /users/{slug} "delete_user" [DELETE] /users/{slug} <?php class UsersController { public function getUsersAction(); public function postUsersAction(); public function getUserAction($slug); public function putUserAction($slug); public function patchUserAction($slug); public function deleteUserAction($slug); jeudi 29 novembre 12
  38. Benjamin Grandfond - PHP Tour Nantes 2012 URL hiérarchisées ?

    public function getUserCommentsAction($slug); public function postUserCommentsAction($slug); public function getUserCommentAction($slug, $id); public function putUserCommentAction($slug, $id); public function deleteUserCommentAction($slug, $id); "get_user_comments" [GET] /users/{slug}/comments "post_user_comments" [POST] /users/{slug}/comments "get_user_comment" [GET] /users/{slug}/comments/{id} "put_user_comment" [PUT] /users/{slug}/comments/{id} "delete_user_comment" [DELETE] /users/{slug}/comments/{id} jeudi 29 novembre 12
  39. Benjamin Grandfond - PHP Tour Nantes 2012 HATEOAS ? {#

    order.xml.twig #} <?xml version="1.0" encoding="utf-8" ?> <order xmlns="{{ app.bf.hateoas.xmlns }}" xmlns:bf="{{ app.bf.hateoas.schemes.definition }}"> <id>{{ order.id }}</id> <amount>{{order.amount}}</amount> <state>{{ order.state }}</state> <bf:link rel="self" href="{{ url(‘order’, { id: order.id }) }}"/> <bf:link rel="{{ app.bf.hateoas.schemes.relations.burgers }}" href="{{ url(‘burger’, { slug: order.burger.slug }) }}"/> <bf:link rel="{{ app.bf.hateoas.schemes.relations.side_orders }}" href="{{ url(‘side_order’, { slug: order.sideOrder.slug }) }}"/> <bf:link rel="{{ app.bf.hateoas.schemes.relations.drinks }}" href="{{ url(‘drink’, { slug: order.drink.slug }) }}"/> <bf:link rel="{{ app.bf.hateoas.schemes.relations.receipts }}" href="{{ url(‘receipt’, { id: order.receipt.id }) }}"/> </order> jeudi 29 novembre 12
  40. Benjamin Grandfond - PHP Tour Nantes 2012 ✔ FOSRestBundle +

    JMSSerializerBundle HATEOAS ? jeudi 29 novembre 12
  41. Benjamin Grandfond - PHP Tour Nantes 2012 HATEOAS ? <?php

    use JMS\SerializerBundle\Annotation as Serializer; /** * @Serializer\ExclusionPolicy("all") * @Serializer\XmlRoot("order") */ class Order { /** * @Serializer\Expose() * @Serializer\Groups({"list", "details"}) */ protected $id; /** * @Serializer\Expose() * @Serializer\ReadOnly() * @Serializer\Groups({"list", "details"}) */ protected $amount; /** * @Serializer\Expose() * @Serializer\ReadOnly() * @Serializer\Groups({"list", "details"}) * @Serializer\Accessor(getter="getStateName") */ protected $state; protected $burger; protected $sideOrder; protected $drink; protected $receipt; } jeudi 29 novembre 12
  42. Benjamin Grandfond - PHP Tour Nantes 2012 ✔ FSCHateoasBundle HATEOAS

    ? https://github.com/TheFootballSocialClub/FSCHateoasBundle jeudi 29 novembre 12
  43. Benjamin Grandfond - PHP Tour Nantes 2012 Mime Type ?

    // src/BurgerFactory/ApiBundle/EventListener/RequestListener.php namespace BurgerFactory\ApiBundle; use Symfony\Component\HttpKernel\HttpKernelInterface; use Symfony\Component\HttpKernel\Event\GetResponseEvent; class RequestListener { public function onKernelRequest(GetResponseEvent $event) { $event->getRequest()->setFormat('xml', 'application/vnd.bf.com'); } } jeudi 29 novembre 12
  44. Benjamin Grandfond - PHP Tour Nantes 2012 ✔ FOSRestBundle Mime

    Type ? # app/config/config.yml fos_rest: view: mime_types: { 'xml': ['application/vnd.bf.com+xml'] } jeudi 29 novembre 12
  45. Benjamin Grandfond - PHP Tour Nantes 2012 Vous n’aimez pas

    Symfony ? Silex Slim Zend Framework ... le vôtre jeudi 29 novembre 12
  46. Benjamin Grandfond - PHP Tour Nantes 2012 Questions à se

    poser • Mon business en a-t-il réellement besoin ? • Combien de temps ? • SOAP n’est pas plus simple/efficace ? ... ça dépend jeudi 29 novembre 12
  47. Benjamin Grandfond - PHP Tour Nantes 2012 Les avantages évolutivité

    auto-documenté scalabilité HTTP (cache, authentification, content negociation ...) jeudi 29 novembre 12
  48. Benjamin Grandfond - PHP Tour Nantes 2012 Vous n’êtes pas

    obligé de faire une API RESTful ! Un CRUD «HTTP» c’est bien aussi :) * * mais ne dîtes pas que c’est une API Rest jeudi 29 novembre 12
  49. Benjamin Grandfond - PHP Tour Nantes 2012 En informatique, l’open

    data est une information structurée publique ou privée et généralement non utilisable par un humain mais interprétable par une machine. wikipedia Open Data jeudi 29 novembre 12
  50. Benjamin Grandfond - PHP Tour Nantes 2012 En informatique, l’open

    data est une information structurée publique ou privée et généralement non utilisable par un humain mais interprétable par une machine. wikipedia = API ! Open Data jeudi 29 novembre 12
  51. Benjamin Grandfond - PHP Tour Nantes 2012 Benjamin Grandfond -

    PHP Tour Nantes 2012 Questions ? @benjaM1 @benja-M-1 https://joind.in/7257 [email protected] jeudi 29 novembre 12