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. Services REST
    & OpenData
    Benjamin Grandfond - PHP Tour Nantes 2012
    jeudi 29 novembre 12

    View Slide

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

    View Slide

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

    View Slide

  4. Benjamin Grandfond - PHP Tour Nantes 2012
    Architectures
    • SOAP
    • XML-RPC
    • URL unique
    • POX (Plain Old XML)
    jeudi 29 novembre 12

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  9. Benjamin Grandfond - PHP Tour Nantes 2012
    REpresentational State Transfer
    jeudi 29 novembre 12

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  14. Benjamin Grandfond - PHP Tour Nantes 2012 littlemalt flickr
    Burger Factory API
    jeudi 29 novembre 12

    View Slide

  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

    View Slide

  16. Création d’une commande
    Benjamin Grandfond - PHP Tour Nantes 2012
    jeudi 29 novembre 12

    View Slide

  17. POST /orders HTTP/1.1
    Host: api.bf.com
    Accept: application/xml
    Content-Type: application/xml


    doublecheese
    fries
    coca

    Benjamin Grandfond - PHP Tour Nantes 2012
    Request
    1
    jeudi 29 novembre 12

    View Slide

  18. HTTP/1.1 201 Created
    Allow: DELETE, GET, PUT
    Content-Type: application/xml
    Location: https://api.bf.com/orders/1234


    1234
    doublecheese
    fries
    coca
    12.00
    pending payment

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

    View Slide

  19. Paiement de la commande
    Benjamin Grandfond - PHP Tour Nantes 2012
    jeudi 29 novembre 12

    View Slide

  20. POST /payments HTTP/1.1
    Host: api.bf.com
    Content-Type: application/xml


    1234
    12.00
    Benjamin Grandfond
    11223344556677
    123
    11
    2013

    Benjamin Grandfond - PHP Tour Nantes 2012
    Request
    3
    jeudi 29 novembre 12

    View Slide

  21. HTTP/1.1 201 Created
    Allow: GET
    Content-Type: application/xml
    Location: https://api.bf.com/receipts/1234


    1234
    1234
    12.00
    2012-11-04 17:53:42

    Benjamin Grandfond - PHP Tour Nantes 2012
    Response
    4
    jeudi 29 novembre 12

    View Slide

  22. Livraison de la commande
    Benjamin Grandfond - PHP Tour Nantes 2012
    jeudi 29 novembre 12

    View Slide

  23. PUT /orders/1234 HTTP/1.1
    Host: api.bf.com
    Content-Type: application/xml


    1234
    doublecheese
    fries
    coca
    12.00
    delivered

    Benjamin Grandfond - PHP Tour Nantes 2012
    Request
    5
    jeudi 29 novembre 12

    View Slide

  24. PATCH /orders/1234 HTTP/1.1
    Host: api.bf.com
    Content-Type: application/xml


    delivered

    Benjamin Grandfond - PHP Tour Nantes 2012
    Request
    5
    jeudi 29 novembre 12

    View Slide

  25. HTTP/1.1 200 Ok
    Host: api.bf.com
    Content-Type: application/xml

    1234
    doublecheese
    fries
    coca
    12.00
    delivered

    Benjamin Grandfond - PHP Tour Nantes 2012
    Response
    6
    jeudi 29 novembre 12

    View Slide

  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

    View Slide

  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

    View Slide

  28. Niveau 2 du RMM
    Benjamin Grandfond - PHP Tour Nantes 2012
    c’est déjà pas mal ;)
    jeudi 29 novembre 12

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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


    1234
    doublecheese
    fries
    coca
    12.00
    delivered

    jeudi 29 novembre 12

    View Slide

  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


    1234
    doublecheese
    fries
    coca
    12.00
    delivered

    Définition des namespaces
    jeudi 29 novembre 12

    View Slide

  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


    1234
    href="http://api.bf.com/orders/1234"/>
    doublecheese
    fries
    coca
    12.00
    delivered

    Lien vers la commande elle-même
    jeudi 29 novembre 12

    View Slide

  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


    1234
    href="http://api.bf.com/orders/1234"/>
    href="http://api.bf.com/burgers/doublecheese">
    fries
    coca
    12.00
    delivered

    Lien vers le burger commandé
    jeudi 29 novembre 12

    View Slide

  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


    1234
    href="http://api.bf.com/orders/1234"/>
    href="http://api.bf.com/burgers/doublecheese">
    href="http://api.bf.com/side-orders/fries">
    coca
    12.00
    delivered

    Lien vers l’accompagnement
    jeudi 29 novembre 12

    View Slide

  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


    1234
    href="http://api.bf.com/orders/1234"/>
    href="http://api.bf.com/burgers/doublecheese">
    href="http://api.bf.com/side-orders/fries">
    href="http://api.bf.com/drinks/coca">
    12.00
    delivered

    Lien vers la boisson
    jeudi 29 novembre 12

    View Slide

  39. HTTP/1.1 200 OK
    Allow: DELETE, GET
    Content-Type: application/vnd.bf.com+xml


    1234
    href="http://api.bf.com/orders/1234"/>
    href="http://api.bf.com/burgers/doublecheese">
    href="http://api.bf.com/side-orders/fries">
    href="http://api.bf.com/drinks/coca">
    12.00
    delivered

    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

    View Slide

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

    View Slide

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

    View Slide

  42. Benjamin Grandfond - PHP Tour Nantes 2012
    ✔ GET, POST, PUT, DELETE
    ✔ PATCH, HEAD, OPTIONS
    Interface uniforme ?
    jeudi 29 novembre 12

    View Slide

  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

    View Slide

  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

    View Slide

  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}
    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

    View Slide

  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

    View Slide

  47. Benjamin Grandfond - PHP Tour Nantes 2012
    ✔ FOSRestBundle + Twig
    HATEOAS ?
    jeudi 29 novembre 12

    View Slide

  48. Benjamin Grandfond - PHP Tour Nantes 2012
    HATEOAS ?
    {# order.xml.twig #}


    {{ order.id }}
    {{order.amount}}
    {{ order.state }}
    href="{{ url(‘order’, { id: order.id }) }}"/>
    href="{{ url(‘burger’, { slug: order.burger.slug }) }}"/>
    href="{{ url(‘side_order’, { slug: order.sideOrder.slug }) }}"/>
    href="{{ url(‘drink’, { slug: order.drink.slug }) }}"/>
    href="{{ url(‘receipt’, { id: order.receipt.id }) }}"/>

    jeudi 29 novembre 12

    View Slide

  49. Benjamin Grandfond - PHP Tour Nantes 2012
    ✔ FOSRestBundle + JMSSerializerBundle
    HATEOAS ?
    jeudi 29 novembre 12

    View Slide

  50. Benjamin Grandfond - PHP Tour Nantes 2012
    HATEOAS ?
    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

    View Slide

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

    View Slide

  52. Benjamin Grandfond - PHP Tour Nantes 2012
    ✔ Symfony
    Mime Type ?
    jeudi 29 novembre 12

    View Slide

  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

    View Slide

  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

    View Slide

  55. Benjamin Grandfond - PHP Tour Nantes 2012
    Vous n’aimez pas Symfony ?
    Silex
    Slim
    Zend Framework
    ...
    le vôtre
    jeudi 29 novembre 12

    View Slide

  56. Benjamin Grandfond - PHP Tour Nantes 2012
    Pourquoi ferais-je une API RESTful ?
    jeudi 29 novembre 12

    View Slide

  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

    View Slide

  58. Benjamin Grandfond - PHP Tour Nantes 2012
    Les avantages
    évolutivité
    auto-documenté
    scalabilité
    HTTP (cache, authentification, content negociation ...)
    jeudi 29 novembre 12

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  63. Benjamin Grandfond - PHP Tour Nantes 2012
    http://www.odata.org/
    Open Data Protocol
    jeudi 29 novembre 12

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  67. 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

    View Slide