Grandfond&cardNumber=11223344556677&cardSecuredNumber=123&expiryMonth=11& expiryDay=21 • multiples URL • un seul verbe HTTP (POST) jeudi 29 novembre 12
: 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
• 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
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
• 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
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
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
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
"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
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
// 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
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
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