Atom désigne donc deux choses :

  • un format de document destiné à la diffusion (syndication) de contenus. Ce format est défini par la RFC 4287;
  • un protocole de gestion de ressources à travers un réseau, décrit dans la RFC 5023;

Le format Atom

C'est un vocabulaire XML. Il définit deux classes d'objets:

  • des items (entry) représentant des contenus;
  • des flux (feed) qui sont des listes d'items;

Le vocabulaire permet d'indiquer de nombreuses méta-données sur les items et les flux (titre, auteurs, catégories, liens, etc). L'utilisation d'XML le rend extensible, c'est à dire qu'on peut l'enrichir de données issues d'autres vocabulaires (par exemple en utilisant Dublin Core. Les flux ATOM sont largement utilisés pour représenter les derniers billets de journaux par exemples.

Le protocole Atom alias AtomPub

C'est un protocole de gestion de ressources accessibles en ligne. Il utilise HTTP pour transporter et gérer des données au format Atom. Il exploite de ce fait toutes les caractéristiques des architectures REST.

Ces principales caractéristiques sont:

  • on appelle ressource n'importe quel objet accessible en ligne et identifiable via une IRI;
  • AtomPub permet de créer, lister, mettre à jour et supprimer des ressources;
  • les ressources peuvent être regroupées dans des collections. Une collection est un ensemble de liens vers des ressources. Celles-ci peuvent être des items Atom (on parle d'Entry Resource) ou des "médias" (Media Resource), appellation générique pour les autres formats. A chaque média sera associé un item avec ses méta-données. La représentation d'une collection est un flux Atom;
  • les collections peuvent elles même être regroupées au sein d'espace de travail (workspace). Ces workspaces sont virtuels, au sens où ils n'ont pas d'IRI, et le protocole ne dit rien de leur administration (ie ne permet pas de créer un wokspace ou une collection). Les workspaces sont eux-même regroupés dans des services;
  • on peut découvrir la liste des collections disponibles via un type de ressources particulier, les services. Chaque collection peut être rattachée à plusieurs services;
  • AtomPub permet de définir des critères d'ajout d'une ressource à un collection, en fonction de son type ou de sa catégorie (une collection pourra n'accepter que certains formats de médias ou que des items appartenant à une catégorie). Le protocole permet également de découvrir la liste des catégories existantes;

La spécification, outre le protocole, définit donc également un vocabulaire XML pour lister les catégories disponibles, les services, espaces de travail et collection. Voici, extrait de la spécification, un exemple de document listant les espaces de travail et les collections disponibles pour un service:

 <?xml version="1.0" encoding='utf-8'?>
 <service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom">
  <workspace>
    <atom:title>Main Site</atom:title>
    <collection href="http://example.org/blog/main" >
      <atom:title>My Blog Entries</atom:title>
      <categories href="http://example.com/cats/forMain.cats" />
    </collection>
    <collection href="http://example.org/blog/pic" >
      <atom:title>Pictures</atom:title>
      <accept>image/png</accept>
      <accept>image/jpeg</accept>
      <accept>image/gif</accept>
    </collection>
  </workspace>
  <workspace>
    <atom:title>Sidebar Blog</atom:title>
    <collection href="http://example.org/sidebar/list" >
      <atom:title>Remaindered Links</atom:title>
      <accept>application/atom+xml;type=entry</accept>
      <categories fixed="yes">
        <atom:category scheme="http://example.org/extra-cats/" term="joke" />
        <atom:category scheme="http://example.org/extra-cats/" term="serious" />
      </categories>
    </collection>
  </workspace>
 </service>

On ne pourra ajouter à la liste des images du blog que des images aux formats PNG, JPEG et GIF; on ne pourra ajouter à la liste des liens du blog que des items Atom des catégories joke et serious.

Exemple de création de contenu avec AtomPub

Un échange classique pourra suivre ce scénario:

  • envoi d'une requête GET à l'adresse d'un service;
  • le serveur répond par la liste des collections disponibles, éventuellement regroupées en ''workspaces';
  • envoi d'une requête GET à l'adresse d'une collection;
  • le serveur répond avec un flux (feed Atom) listant les éléments de la collection (la liste peut être partielle et paginable. Elle contiendra dans ce cas des liens vers les URI des pages précédente et suivante);
  • le client crée une nouvelle ressource à l'intérieur d'une collection en POSTant un document à l'adresse de la collection;
  • le serveur répond avec l'adresse de la ressource créée;
  • le client peut alors gérer la ressource en envoyant GET, PUT ou DELETE à son adresse;

Création d'une ressource de type "média"

Comme pour un item Atom, il suffit pour créer un média quelconque de le poster à l'adresse de la collection. Le serveur va enregistrer la ressource selon son mécanisme propre (un fichier, dans une base de données, etc), et créer un item Atom contenant un lien vers l'URI de la nouvelle ressource, puis renvoyer cet item au client.

Les liens

Une entrée Atom peut comporter un certain nombre de liens, dont la signification est précisée via leur attribut rel :

  • alternate pour un lien vers une version alternative de la même ressource;
  • related pour un sujet lié;
  • self pour donner l'IRI de la ressource elle-même;
  • enclosure pour pointer vers des documents "lourds" (par exemple des fichiers);
  • via désigne la source de l'information;

AtomPub ajoute deux types de liens :

  • edit contient l'IRI à utiliser pour éditer la resource;
  • edit-media lorsque l'entrée correspond à un média;

Pour aller plus loin

Deux autres spécifications, moins connues, étendent le format Atom.

La RFC 4685 permet de définir les liens entre des contenus au sein d'un fil de discussion (thread). Elle ajoute au format Atom deux éléments et un type de lien:

  • les éléments in-reply-to pointent vers les ressources auxquelles le contenu répond;
  • à l'inverse, les liens de type replies pointent vers les réponse à un contenu. Par exemple, dans le cas d'un billet de blog, vers les commentaires de premier niveau. Un flux ou une entrée peuvent avoir plusieurs liens vers leurs réponses. Ces liens peuvent également avoir deux nouveaux attributs de premier niveau: count indiquant le nombre de réponses dans la ressource, et updated avec la date de la réponse la plus récente;
  • enfin, un élément total permet d'indiquer le nombre total de réponses connues;

Un flux contenant un billet et un commentaire pourrait ressembler à :

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0">
  <id>http://www.example.org/myfeed</id>
  <title>My Example Feed</title>
  <updated>2005-07-28T12:00:00Z</updated>
  <link href="http://www.example.org/myfeed" />
  <author><name>James</name></author>
  <entry>
    <id>tag:example.org,2005:1</id>
    <title>My original entry</title>
    <updated>2006-03-01T12:12:12Z</updated>
    <link type="application/xhtml+xml" href="http://www.example.org/entries/1" />
    <link rel="replies" type="application/atom+xml" href="http://www.example.org/mycommentsfeed.xml" thr:count="1" thr:updated="2005-07-28T12:10:00Z" />
    <thr:total>1</thr:total>
    <summary>This is my original entry</summary>
  </entry>
  <entry>
    <id>tag:example.org,2005:1,1</id>
    <title>A response to the original</title>
    <updated>2006-03-01T12:12:12Z</updated>
    <link href="http://www.example.org/entries/1/1" />
    <thr:in-reply-to ref="tag:example.org,2005:1" type="application/xhtml+xml" href="http://www.example.org/entries/1"/>
    <summary>This is a response to the original entry</summary>
  </entry>
</feed>

La RFC 4946, expérimentale, propose de permettre d'indiquer la licence d'un contenu via l'utilisation d'un nouveau type de liens. Par exemple, pour un contenu sous CC-BY-NC on pourrait avoir <link rel="license" type="application/rdf+xml" href="http://creativecommons.org/licenses/by-nc/2.5/rdf" />;

Bref

Atom et AtomPub fournissent les bases nécessaires pour gérer tout type de contenu accessible en ligne. Leur caractère ouvert permet de plus de les adapter facilement à des contraintes spécifiques. Je ne peux donc que vous encourager à les utiliser chaque fois que vous aurez besoin de manipuler des contenus. A noter toutefois qu'AtomPub est moins mature, et mériterait peut-être quelques ajouts. J'apprécierais par exemple de pouvoir avec les mêmes mécanismes gérer également les services et les collections.