Services REST et Open Data

Services REST et Open Data

79637b39737f884d090cac0d7c768351?s=128

Benjamin Grandfond

November 29, 2012
Tweet

Transcript

  1. Services REST & OpenData Benjamin Grandfond - PHP Tour Nantes

    2012 jeudi 29 novembre 12
  2. Benjamin Grandfond Benjamin Grandfond - PHP Tour Nantes 2012 Technical

    Team Manager @benjaM1 @benja-M-1 jeudi 29 novembre 12
  3. Benjamin Grandfond - PHP Tour Nantes 2012 APIs jeudi 29

    novembre 12
  4. Benjamin Grandfond - PHP Tour Nantes 2012 Architectures • SOAP

    • XML-RPC • URL unique • POX (Plain Old XML) jeudi 29 novembre 12
  5. 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
  6. Benjamin Grandfond - PHP Tour Nantes 2012 Richardson Maturity Model

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

    PHP Tour Nantes 2012 ~Xavur deviantart jeudi 29 novembre 12
  8. 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
  9. Benjamin Grandfond - PHP Tour Nantes 2012 REpresentational State Transfer

    jeudi 29 novembre 12
  10. 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
  11. 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
  12. Benjamin Grandfond - PHP Tour Nantes 2012 Contraintes • Client

    - Serveur • Stateless • Cacheable • Code On Demand (optionelle) • Interface uniforme jeudi 29 novembre 12
  13. 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
  14. Benjamin Grandfond - PHP Tour Nantes 2012 littlemalt flickr Burger

    Factory API jeudi 29 novembre 12
  15. 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
  16. Création d’une commande Benjamin Grandfond - PHP Tour Nantes 2012

    jeudi 29 novembre 12
  17. 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
  18. 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
  19. Paiement de la commande Benjamin Grandfond - PHP Tour Nantes

    2012 jeudi 29 novembre 12
  20. 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
  21. 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
  22. Livraison de la commande Benjamin Grandfond - PHP Tour Nantes

    2012 jeudi 29 novembre 12
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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
  28. Niveau 2 du RMM Benjamin Grandfond - PHP Tour Nantes

    2012 c’est déjà pas mal ;) jeudi 29 novembre 12
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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
  36. 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
  37. 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
  38. 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
  39. 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
  40. Benjamin Grandfond - PHP Tour Nantes 2012 Benjamin Grandfond -

    PHP Tour Nantes 2012 Niveau 3 du RMM Hypermedia jeudi 29 novembre 12
  41. Benjamin Grandfond - PHP Tour Nantes 2012 jeudi 29 novembre

    12
  42. Benjamin Grandfond - PHP Tour Nantes 2012 ✔ GET, POST,

    PUT, DELETE ✔ PATCH, HEAD, OPTIONS Interface uniforme ? jeudi 29 novembre 12
  43. 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
  44. 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
  45. 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
  46. 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
  47. Benjamin Grandfond - PHP Tour Nantes 2012 ✔ FOSRestBundle +

    Twig HATEOAS ? jeudi 29 novembre 12
  48. 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
  49. Benjamin Grandfond - PHP Tour Nantes 2012 ✔ FOSRestBundle +

    JMSSerializerBundle HATEOAS ? jeudi 29 novembre 12
  50. 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
  51. Benjamin Grandfond - PHP Tour Nantes 2012 ✔ FSCHateoasBundle HATEOAS

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

    Type ? jeudi 29 novembre 12
  53. 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
  54. 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
  55. Benjamin Grandfond - PHP Tour Nantes 2012 Vous n’aimez pas

    Symfony ? Silex Slim Zend Framework ... le vôtre jeudi 29 novembre 12
  56. Benjamin Grandfond - PHP Tour Nantes 2012 Pourquoi ferais-je une

    API RESTful ? jeudi 29 novembre 12
  57. 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
  58. Benjamin Grandfond - PHP Tour Nantes 2012 Les avantages évolutivité

    auto-documenté scalabilité HTTP (cache, authentification, content negociation ...) jeudi 29 novembre 12
  59. 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
  60. Benjamin Grandfond - PHP Tour Nantes 2012 OpenData jeudi 29

    novembre 12
  61. 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
  62. 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
  63. Benjamin Grandfond - PHP Tour Nantes 2012 http://www.odata.org/ Open Data

    Protocol jeudi 29 novembre 12
  64. Benjamin Grandfond - PHP Tour Nantes 2012 http://data.stackexchange.com/stackoverflow/atom http://ebayodata.cloudapp.net/ http://www.nerddinner.com/Services/OData.svc/

    Open Data Protocol jeudi 29 novembre 12
  65. Benjamin Grandfond - PHP Tour Nantes 2012 Open Data Protocol

    jeudi 29 novembre 12
  66. Benjamin Grandfond - PHP Tour Nantes 2012 Open Data Protocol

    jeudi 29 novembre 12
  67. Benjamin Grandfond - PHP Tour Nantes 2012 Benjamin Grandfond -

    PHP Tour Nantes 2012 Questions ? @benjaM1 @benja-M-1 https://joind.in/7257 benjamin.grandfond@gmail.com jeudi 29 novembre 12