Naar inhoud springen

HATEOAS

Uit Wikipedia, de vrije encyclopedie

Hypermedia as the engine of application state (HATEOAS) is een beperking van de architectuurstijl van de REST-software waardoor deze verschilt van andere netwerkarchitectuurstijlen .

Met HATEOAS communiceert een client met een netwerkapplicatie waarvan de applicatieservers informatie dynamisch verstrekken via hypermedia. Een REST-client heeft weinig tot geen voorkennis nodig over de interactie met een applicatie of server, afgezien van een algemeen begrip van hypermedia.

Clients en servers in Common Object Request Broker Architecture (CORBA) communiceren daarentegen via een vaste interface die wordt gedeeld via documentatie of een interfacebeschrijvingstaal (IDL).

De door HATEOAS opgelegde beperkingen ontkoppelen client en server. Hierdoor kan de serverfunctionaliteit onafhankelijk evolueren.

De term werd in 2000 bedacht door Roy Fielding in zijn proefschrift.

Voorbeeld[bewerken | brontekst bewerken]

Een user-agent doet een HTTP-verzoek aan een REST API via een toegangspunt-URL. Alle daaropvolgende verzoeken die de user-agent kan doen, kan de agent terugvinden in het antwoord op elk verzoek. De mediatypen die voor deze representaties worden gebruikt, en de linkrelaties die ze kunnen bevatten, maken deel uit van de API. De client gaat door applicatiestatussen door te kiezen uit de koppelingen binnen een representatie of door de representatie op andere manieren te manipuleren die aangeboden worden door het mediatype. Op deze manier wordt RESTful-interactie aangestuurd door hypermedia, in plaats van out-of-band-informatie.

Met dit GET-verzoek wordt bijvoorbeeld een accountresource opgehaald, waarbij details worden opgevraagd in een JSON-weergave:

GET /accounts/12345 HTTP/1.1
Host: bank.example.com

Het antwoord luidt:

HTTP/1.1 200 OK

{
  "account": { 
    "account_number": 12345,
    "balance": {
      "currency": "usd",
      "value": 100.00
    },
    "links": {
      "deposits": "/accounts/12345/deposits",
      "withdrawals": "/accounts/12345/withdrawals",
      "transfers": "/accounts/12345/transfers",
      "close-requests": "/accounts/12345/close-requests"
    }
  }
}

Het antwoord bevat de volgende mogelijke vervolglinks: POST een storting (deposit), opname (withdrawal), transfer of sluitingsverzoek (close-request, om de rekening te sluiten).

Later, bijvoorbeeld als de rekening in het rood is gegaan, is er een andere reeks beschikbare links, omdat de rekening rood staat.

HTTP/1.1 200 OK

{
  "account": { 
    "account_number": 12345,
    "balance": {
      "currency": "usd",
      "value": -25.00
    },
    "links": {
      "deposits": "/accounts/12345/deposits"
    }
  }
}

Nu is er slechts één link beschikbaar: om meer geld te storten (door te POSTen naar stortingen). In de huidige staat zijn de andere links niet beschikbaar. Vandaar de term Engine of Application State. Welke acties mogelijk zijn, hangt af van de status van de bron.

Een client hoeft niet elk mediatype en communicatiemechanisme te begrijpen dat door de server wordt aangeboden. Het vermogen om nieuwe mediatypen te begrijpen kan tijdens runtime worden verkregen via "code-on-demand" die door de server aan de client wordt geleverd.

Oorsprong[bewerken | brontekst bewerken]

De HATEOAS-beperking is een essentieel onderdeel van de 'uniforme interface'-functie van REST, zoals gedefinieerd in het proefschrift van Roy Fielding. Fielding heeft het concept verder beschreven op zijn blog.

Het doel van een deel van de striktheid van deze en andere REST-beperkingen, legt Fielding uit, is ‘softwareontwerp op de schaal van tientallen jaren: elk detail is bedoeld om de levensduur van software en onafhankelijke evolutie te bevorderen. Veel van de beperkingen zijn direct tegengesteld aan de kortetermijnefficiëntie Helaas zijn mensen redelijk goed in ontwerpen voor de korte termijn, en meestal slecht in ontwerpen voor de lange termijn".

Implementaties[bewerken | brontekst bewerken]

  • HTML zelf is hypermedia, met het <form> ... </form>-element dat controle heeft over HTTP-verzoeken voor links.
  • HAL, hypermedia gebouwd bovenop JSON of XML. Definieert koppelingen, maar geen acties (HTTP-verzoeken).
  • JSON-LD, standaard voor hyperlinks in JSON. Gaat niet in op acties.
  • Sirene, hypermedia gebouwd bovenop JSON. Definieert koppelingen en acties.
  • Collection+JSON, hypermedia gebouwd bovenop JSON. Definieert koppelingen en acties.
  • JSON:API, definieert koppelingen en acties.
  • Hydra . Bouwt voort op JSON-LD om definitie van acties toe te voegen.