Hypermedia As The Engine Of Application State (HATEOAS) is a component of the REST application architecture that distinguishes it from other network application architectures.
With HATEOAS, a client interacts with a network application whose application servers provide information dynamically through hypermedia. A REST client needs little to no prior knowledge about how to interact with an application or server beyond a generic understanding of hypermedia.
The way that the HATEOAS constraint decouples client and server enables the server functionality to evolve independently.
A REST client enters a REST application through a simple fixed URL. All future actions the client may take are discovered within resource representations returned from the server. The media types used for these representations, and the link relations they may contain, are standardized. The client transitions through application states by selecting from the links within a representation or by manipulating the representation in other ways afforded by its media type. In this way, RESTful interaction is driven by hypermedia, rather than out-of-band information.
For example,  this GET request fetches an account resource, requesting details in an XML representation:
GET /accounts/12345 HTTP/1.1 Host: bank.example.com Accept: application/xml ...
The response is:
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="https://bank.example.com/accounts/12345/deposit" /> <link rel="withdraw" href="https://bank.example.com/accounts/12345/withdraw" /> <link rel="transfer" href="https://bank.example.com/accounts/12345/transfer" /> <link rel="close" href="https://bank.example.com/accounts/12345/status" /> </account>
The response contains these possible follow-up links: make a deposit, withdrawal, or transfer, or close the account.
When the account information is retrieved later, the account is overdrawn:
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="https://bank.example.com/accounts/12345/deposit" /> </account>
Now only one link is available: to deposit more money. In its current state, the other links are not available. Hence the term Engine of Application State. What actions are possible varies as the state of the resource varies.
A client does not need to understand every media type and communication mechanism offered by the server. The ability to understand new media types can be acquired at run-time through "code-on-demand" provided to the client by the server.
The HATEOAS constraint is an essential part of the "uniform interface" feature of REST, as defined in Roy Fielding's doctoral dissertation. Fielding has further described the concept on his blog.
The purpose of some of the strictness of this and other REST constraints, Fielding explains, is "software design on the scale of decades: every detail is intended to promote software longevity and independent evolution. Many of the constraints are directly opposed to short-term efficiency. Unfortunately, people are fairly good at short-term design, and usually awful at long-term design".
- Spring HATEOAS, part of the Spring Framework
- Yii 2 Framework REST API supports HATEOAS, part of the Yii Framework (since version 2.0)
- Jersey API supports HATEOAS
- Tastypie supports HATEOAS
- Eve (Python, Flask-based) supports HATEOAS
- Apigility, API builder based on Zend Framework 2, supports HATEOAS
- Hateoas PHP library, supports HATEOAS REST Web Services implementations.
- API Platform, PHP framework based on hypermedia and Linked Data support with JSON-LD, Schema.org and Hydra
- AtomGraph Processor, a Java backend for building declarative, read-write Linked Data applications, supports HATEOAS Linked Data
- Symfony Framework supports HATEOAS with willdurand/Hateoas
- WSO2 Governance REST API, supports HATEOAS based hypermedia and Linked Data.
- Hypertext Application Language
- Universal Description Discovery and Integration is the equivalent for the Web Services Description Language
- Fielding, Roy T. (20 Oct 2008). "REST APIs must be hypertext-driven". Retrieved 20 May 2010.
- "The RESTful CookBook"
- Fielding, Roy Thomas (2000). "Representational State Transfer (REST)". Architectural Styles and the Design of Network-based Software Architectures (PhD). University of California, Irvine.
- "Spring HATEOAS"
- "Yii 2 HATEOAS"
- Jersey and HATEOAS
- Tastypie documentation
- python-eve features - open source Python REST API framework.
- Apigility Documentation on HAL format
- Linked Data Templates - Ontology-driven approach to read-write Linked Data