Introductie van Odata V4
Een API (Application Programming Interface) is een set aan basisregels en middelen over hoe applicaties met elkaar kunnen communiceren. Dit heeft meestal betrekking op het delen en manipuleren van informatie tussen verschillende applicaties of verschillende applicatielagen.
Tegenwoordig zien we veel van deze API’s terug in de vorm van REST (Representational State Transfer) API’s. Deze volgen een aantal principes om ervoor te zorgen dat ontwikkelaars en applicaties weten hoe ze met elkaar kunnen praten en gegevens uitwisselen.
De Odata V4 standaard doet hier een schepje bovenop. Zo biedt Odata de mogelijk om vanaf GET end-points door middel van query’s specifieke gegevens op te vragen.
Neem bijvoorbeeld de volgende Odata entiteitmodellen:
<EntityType Name="Organization">
<Key>
<PropertyRef Name="organizationId" />
</Key>
<Property Name="organizationId" Type="Edm.Int32" Nullable="false" />
<Property Name="name" Type="Edm.String" Nullable="false" MaxLength="250" />
<Property Name="addressId" Type="Edm.Int32" Nullable="false" />
<NavigationProperty Name="address" Type="Models.Address">
<ReferentialConstraint Property="addressId" ReferencedProperty="addressId" />
</NavigationProperty>
</EntityType>
<EntityType Name="Address">
<Key>
<PropertyRef Name="addressId" />
</Key>
<Property Name="addressId" Type="Edm.Int32" Nullable="false" />
<Property Name="streetName" Type="Edm.String" MaxLength="255" />
<Property Name="houseNumber" Type="Edm.String" MaxLength="255" />
</EntityType>
Om simpel van start te gaan, kan er gebruik gemaakt worden van een zogeheten select om alleen de naam van de organisatie op te halen:
Aanroep: ~/odata/organization(1)?$select=name
Resultaat:
{
"@odata.context":"~/odata/$metadata#organization(name)",
"value":[
{
"name":"Sigma Solutions"
}
]
}
Hierdoor krijg je een SQL-achtige kracht, direct bij het aanroepen van je GET end-points (mits het een queryable end-point is). Dit betekent dat je altijd precies kunt ophalen wat je nodig hebt. Dit zorgt voor minder overhead, meer implementatiegemak en precisie.
Odata biedt zelfs de kracht om dieper te gaan in onderliggende objecten. Zoals uit het entiteitmodel te zien is, beschikt een organisatie over een adres. Door een expand te gebruiken, kunnen we deze ook bij ons resultaat betrekken:
Aanroep: ~/odata/organization(1)?$select=name&$expand=address
Resultaat:
{
"@odata.context": "~/odata/$metadata#organization(name,address())",
"value": [
{
"name": "Sigma Solutions",
"address": {
"addressId": 1,
"streetName": "Wilhelminalaan",
"houseNumber": "1",
}
}
]
}
Goede basis voor een headless aanpak
Het doel van de aanpak vanuit het Odata protocol is dan ook om zo direct mogelijk te werken met je databasemodellen. Dit verlaagt de complexiteit, omdat er geen gebruik gemaakt hoeft te worden van verschillende models (view) die alleen gebruikt worden in één specifieke situatie (bijvoorbeeld een overzichtspagina). Het resultaat van deze databasegeoriënteerde aanpak is dat de complexiteit van de backend afneemt, terwijl de kracht van de implementatie en het aantal mogelijkheden toeneemt voor de front-end. Deze manier van API’s creëren en consumeren sluit perfect aan bij de principes van headless applicaties.
Meer query kracht
Naast de select en expand die zijn gedemonstreerd, zijn er nog veel meer andere opties! Zo kan er gekozen worden uit de volgende opties om precies tot de gewenste resultaat set te komen:
Bronnen: 1. Microsoft WebApi 2 met Odata V4