HATEOAS und ASP.NET Web API OData

Ich liebe Akronyme *nicht*

Hypermedia as the Engine of Application State

und (heißt wirklich nur und)

Active Server Pages

.NET Framework

World Wide Web

Application Programming Interface

Open Data Protocol

Viele meinen wenn Sie REST schreiben/sagen die Repräsentation einer Datenmenge über eine URI. Da es keinen Standard gibt, sondern nur eine Dissertation ( und man weis heute genau wie diese entstehen), kann sich jeder reinfantasieren was er möchte. Ich habe auf den Microsoft Techdays in Basel dazu einen Vortrag gehalten, den man sich auch noch ansehen kann.

In der aktuellen Implementierung des Odata Stacks finden sich Konzepte die der statuslosen Zustandsbeschreibung folgen. Hypermedia interpretiere ich so, das die Daten Auskunft über ihren Zustand und Möglichkeiten geben. Ganz ähnlich wie das ein HTML Dokument im Browser auch tut.

Wenn im Modell einen klassische Relation definiert wird- wie Kunden Bestellungen-, dann mag das die ASP.NET Web Api nicht so (Stichwort zirkuläre Referenzen bei der JSON Serialisierung).

Es gibt einen Workaround für die WebApiConfig

config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore

am Ende sieht das Ergebnis so aus

image

Das ist im Web nicht gut, weil viel zu viele Daten, auch redundant, übertragen werden. Wer sich mit EF beschäftigt kennt Lazy Loading.

nw.Configuration.LazyLoadingEnabled = False

Dann werden die Daten HATEOAS typisch übertragen. Man erkennt in den Daten, das eine Relation zu Orders besteht.

image

Eigentlich sollte jede Datenmenge über eine LINK Element zu identifizieren sein. Ist leider kein Standardverhalten. Also im klassischen (was für ein Wort) REST per /ALFKI.

image

Soweit ich das aktuell einschätze wird man einen Mediatypeformater brauchen oder in das Controller Event direkt eingreifen um die UIR/LINKS einzubauen. Typische Realisierungen könnten ein <link> Element oder ein href Attribut verwenden um die URI aufzunehmen. Auf MSDN kann man ein wenig dazu nachlesen.

Ein weiteres Fundstück hilft beim Paging. Die Daten sagen über sich selbst, das noch weitere Daten  vorhanden sind und wie man diese abrufen kann. Dieser NextLink findet sich nur in der Odata Erweiterung.

image

Kommentare sind geschlossen