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

REST Web APIs - Unissons nos efforts

REST Web APIs - Unissons nos efforts

Voilà maintenant plusieurs années que REST s'est invité dans nos APIs web, et les concepts de base que ce style apporte sont désormais bien assimilés. Nous pouvons d'ailleurs observer une multiplication des APIs dites REST, mais qui restent néanmoins assez différentes les unes des autres. Ne serait-il pas venu le temps de standardiser nos APIs ? Grâce à l'utilisation de l'hypermedia et l'exploration du concept de "semantic gap", ce lightning talk vous propose ainsi de découvrir comment unir nos efforts pour construire les APIs REST de demain.

[Conférence donnée lors de la DjangoCong 2015]

Alexandre Figura

May 09, 2015
Tweet

More Decks by Alexandre Figura

Other Decks in Programming

Transcript

  1. Etat des lieux  De nombreuses APIs dites REST existent.

     Utilisant le format JSON (non hypermedia).  Souvent pour représenter des collections d'objets.  Mais avec des représentations différentes.  Résultat : autant de clients que d'APIs.
  2. { "hits": { "total": 14, "hits": [ { "_index": "us",

    "_type": "tweet", "_id": "7", "_score": 1, "_source": { "date": "2014-09-17", "name": "John Smith", "tweet": "The Query DSL is really powerful and flexible", "user_id": 2 } } ], "max_score": 1 }, "took": 4, "_shards": { "failed": 0, "successful": 10, "total": 10 }, "timed_out": false, "_scroll_id": "c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1" } Elasticsearch API
  3. { "statuses": [ { "created_at": "Mon Sep 24 03:35:21 +0000

    2012", "text": "Aggressive Ponytail #bandnames", "retweet_count": 0, "id": 250075927172759552, "user": { "name": "Sean Cummings", "profile_image_url": "http://a0.twimg.com/profile_images/6665/ii5s_normal.jpeg", "statuses_count": 579, "friends_count": 110, "screen_name": "sean_cummings" } } ], "search_metadata": { "max_id": 518145, "since_id": 51000, "refresh_url": "?since_id=518145&q=%23bandnames&result_type=mixed", "next_results": "?max_id=817023&q=%23bandnames&count=4&result_type=mixed", "count": 1, "completed_in": 0.035, "query": "%23bandnames", } } Twitter API
  4. Une histoire de sémantique  Que l'on soit un humain

    ou une machine, il est nécessaire de comprendre une API pour pouvoir interagir avec elle.  Quelles sont les méthodes disponibles pour accéder aux ressources ? (sémantique du protocole)  Que représentent les ressources ? (sémantique de l'application)
  5. { "collection": { "version": "1.0", "href": "http://twitter.com/tweets/", "links": [ {

    "rel": "profile", "href": "http://alps.io/profiles/tweets" } ], "queries": [ { "rel": "collection", " href": "http://twitter.com/tweets/", "data": [ { "name": "tweetSearch", "value": "", "prompt": "Search Tweet" } ] } ], "items": [ { "href": "http://twitter.com/tweets/4736" , " rel": "item", "data": [ { "name": "createdAt" , " value": "Mon Sep 24 03:35:21 +0000 2012" }, { "name": "text" , " value": "Aggressive Ponytail #bandnames" }, { "name": "user", "value": "sean_cummings" } ] } ] } } Collection+JSON
  6. <alps version="1.0"> <doc format="text">A tweet list.</doc> <!-- a hypermedia control

    for returning tweets --> <descriptor id="collection" type="safe" rt="tweet"> <doc> A simple link/form for getting a list of tweets. </doc> <descriptor id="nameSearch" type="semantic"> <doc>Input for a search form.</doc> </descriptor> </descriptor> <!-- a tweet: one or more of these may be returned --> <descriptor id="tweet" type="semantic"> <descriptor id="item" type="safe"> <doc>A link to an individual tweet.</doc> </descriptor> <descriptor id="createdAt" type="semantic"/> <descriptor id="text" type="semantic"/> <descriptor id="user" type="semantic"/> </descriptor> </alps> ALPS
  7. Un peu de lecture...  Documentation du format Collection+JSON :

     http://amundsen.com/media- types/collection/format/  Draft du format ALPS :  http://tools.ietf.org/html/draft- amundsen-richardson-foster-alps- 01