HATEOAS, abréviation d'Hypermedia As The Engine of Application State (Hypermédia en tant que moteur de l'état d'application), constitue une contrainte de l'architecture d'application REST qui la distingue de la plupart des autres architectures d'applications réseau.
Le principe est qu'un client interagit avec une application réseau entièrement par hypermédia fournie dynamiquement par les serveurs d'applications. Un client REST n'a besoin d'aucune connaissance préalable sur la façon d'interagir avec une application ou un serveur particulier au-delà d'une compréhension générique de l'hypermédia.
À l'inverse, les clients et les serveurs CORBA interagissent via une interface fixe partagée par la documentation ou une langue de description d'interface (IDL).
La contrainte HATEOAS découple le client et le serveur de façon à permettre au serveur d'évoluer de manière indépendante dans ses fonctionnalités.
Un client REST accède à une application REST à l'aide d'une simple URL fixe. Toutes les futures actions que le client peut entreprendre sont découvertes dans les représentations de la ressource retournée par le serveur. Les types de médias utilisés pour ces représentations, et les relations de liens qu'ils peuvent contenir, sont normalisés. Le client passe d'un état d'application à l'autre en sélectionnant des liens à l'intérieur d'une représentation ou en manipulant la représentation par d'autres moyens offerts par son type de média. De cette façon, l'interaction RESTful est pilotée par l'hypermédia, plutôt que par des informations hors bande.
Par exemple[1], cette requête GET récupère une ressource account, demandant des détails dans une représentation XML :
GET /accounts/12345/ HTTP/1.1
Host: bank.example.com
Accept: application/xml
...
La réponse est :
HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: ...
<?xml version="1.0"?>
<account>
<account_number>12345</account_number>
<balance currency="usd">100.00</balance>
<link rel="deposit" href="/accounts/12345/deposit" />
<link rel="withdraw" href="/accounts/12345/withdraw" />
<link rel="transfer" href="https://bank.example.com/accounts/12345/transfer" />
<link rel="close" href="https://bank.example.com/accounts/12345/close" />
</account>
La réponse contient les liens suivants : deposit (effectuer un dépôt), withdraw (effectuer un retrait), transfer (effectuer un transfert), ou close (clôturer le compte).
Lorsque les informations du compte sont récupérées ultérieurement, le compte est à découvert :
HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: ...
<?xml version="1.0"?>
<account>
<account_number>12345</account_number>
<balance currency="usd">-25.00</balance>
<link rel="deposit" href="/accounts/12345/deposit" />
</account>
Maintenant un seul lien est disponible : deposit. Dans son état actuel, les autres liens ne sont pas disponibles. D'où le EOAS de HATEOAS, pour Engine of Application State : les actions possibles varient en fonction de l'état de la ressource.
Un client n'a pas besoin de comprendre tous les types de médias et mécanismes de communication offerts par le serveur. La capacité de comprendre les nouveaux types de médias peut être acquise au moment de l'exécution grâce au "code à la demande" fourni au client par le serveur.