Gebruik van URNs
Auteur: Joeri Bekker | Status: Review
Omschrijving
In de REST API’s die vanaf de VNG API standaard voor ZGW zijn geïntroduceerd, wordt van het ene object naar een ander object, verwezen met een URL (Uniform Resource Locator). Bijvoorbeeld om aan te geven dat eaen ENKELVOUDIGINFORMATIEOBJECT bij een ZAAK hoort, of dat een ZAAK hoort bij een bepaald ZAAKTYPE.
Ter illustratie een ZAAK (in de Zaken API) van een ZAAKTYPE (in de Catalogi API):
{
"url": "<https://www.utrecht.nl/open-zaak-commutr/zaken/api/v1/zaken/b67d13>",
"uuid": "b67d13",
"zaakidentificatie": "ZAAK-0001",
"zaaktype": "<https://www.utrecht.nl/open-zaak-commutr/catalogi/api/v1/zaaktypen/60aa32>",
...
}
Voor de leesbaarheid worden UUIDs afgekort tot 6 tekens.
URLs zijn meestal te volgen door software en, met de juiste credentials, is de inhoud (de gegevens) achter de URL ook daadwerkelijk op te halen door de software.
URLs bevatten een locatie bedoeld voor software om te volgen. De locatie van een object in register A ligt vast bij het object in register B. Bijvoorbeeld: Een ZAAK in de Zaken API bevat een locatie naar een ander register, de Catalogi API, om het ZAAKTYPE te vinden. Als software gegevens opvraagt van register A, en een URL krijg naar register B, dan moet de software ook credentials hebben om register B te bevragen.
Probleemstelling
Het gebruik van URLs om te verwijzen naar objecten kent een aantal nadelen:
Een URL is niet zomaar te bevragen, je hebt hier (meestal) credentials voor nodig
Een URL werkt enkel met digitale registraties, en vereisen dat deze een API hebben
Een URL bevat een domein naam:
Als het domein wijzigt, zijn alle verwijzingen ongeldig. Dit vergt aanpassingen over de gehele dataset in het gehele landschap.
Het domein kan binnen of buiten de organisatie (interne/externe DNS) anders routeren, wat voor fouten of onnodig netwerk verkeer kan zorgen
Bij gebruik van Gateway moeten de URLs/domeinen getransformeerd worden.
Bij overhevelen van gegevens, bijv. van een acceptatie naar productie omgeving, moet de URL overal aangepast worden (variant van a).
Het grote voordeel van URLs is dat ze, exact aangeven waar de informatie beschikbaar is maar daar heb je niet zo veel aan als je toch credentials nodig hebt (en dit in je client applicatie moet matchen tegen de URL) of als de URL niet werkt.
Doelstelling
Het doel is om te kijken of er een alternatief is dat de nadelen van URLs kan wegnemen of verkleinen.
Oplossingsrichting
Hiertoe kijken we naar URN (Uniform Resource Name) en URI (Uniform Resource Identifier). Een voorbeeld van een URN is een ISBN (International Standard Book Number). Als URN bestaat bijvoorbeeld urn:isbn:0-486-27557-4
wat niets zegt over waar dit boek zich bevind maar als je het register weet (de bibliotheek) kan je het vinden.
Een URI is echter vrijwel synoniem met URN maar heeft het formaat van een URL (technisch genomen, heeft een URL het formaat van een URI) en kan daarom voor verwarring zorgen. We vergelijken daarom vooral URLs en URNs. URNs bieden een aantal voordelen op de genoemde nadelen van URLs.
URL
URN
Resolve-methode (mapping)
DNS
Client applicatie configuratie
Credentials
Client applicatie configuratie
Client applicatie configuratie
Geschikt voor type registraties
API’s
Alles (API’s, Webservices, Excel)
Wijzigingen nodig als omgeving / infra wijzigt
Client applicatie configuratie + (data migratie in) registraties
Client applicatie configuratie
Impact van gegevens overhevelen naar andere omgeving
Data migratie
Client applicatie configuratie
Veiligheid
Data zonder “resolving” mogelijk onbedoeld op te vragen
Data enkel met “resolving” op te vragen.
URN’s bieden tevens de kans om verwijzingen op een vastgestelde structurele manier te beschrijven zonder uitspraak te doen over hoe of waar het object kan worden opgehaald.
We zien hier 2 kern-voordelen:
Alle configuratie benodigd om gegevens op te vragen bevind zich in de client applicatie
Data wordt porteerbaar, en de locatie wijzigt d.m.v. client applicatie configuratie
Een URN-formaat zou bijvoorbeeld kunnen zijn: <organisatie>:<component>:<resource>:<systeem>:<identificatie>
. Op deze manier heb je alle gegevens die nodig zijn, door middel van de fragmenten van een URN:
organisatie
geeft aan bij wie het staat (idealiter vaste lijst)component
geeft aan in welk component de resource zit (idealiter vast lijst, uit GEMMA/NORA) - Na discussie toegevoegd. In eerste instantie zou deze af te leiden zijn uit deresource
maar er zijn wellicht toch kans op duplicaties dat wordt voorkomen met dit attribuut.resource
geeft aan wat het is (idealiter vaste lijst, uit GEMMA/NORA)systeem
geeft aan, met 1 en 2 erbij, waar je het kunt ophalen (flexibel)identificatie
geeft aan hoe je dit specifieke item ophaalt (flexibel)
Het voorbeeld bovenaan, zou met URNs bijvoorbeeld worden (lees het advies voor meer voorbeelden):
{
"urn": "utrecht:zrc:zaak:zaken-sociaal:b67d13",
"uuid": "b67d13",
"zaakidentificatie": "ZAAK-0001",
"zaaktype": "utrecht:ztc:zaaktype:zaken-sociaal:60aa32",
...
}
Landelijke registraties
Voor landelijke registraties zoals de KVK, zou een eenvoudigere URN structuur gehanteerd worden, immers zijn er geen andere systemen of organisaties. Dit is buiten scope voor nu maar ter inspiratie:
brp:nnp:bsn:111222333
hr:nnp:kvk_nummer:12345678
hr:nnp:kvk_nummer:12345678:vestigingsnummer:12345678
hr:nnp:vestigingsnummer:12345678
hr:nnp:rsin:123456789011
Advies
Introduceer bij nieuwe registraties enkel URNs voor verwijzingen naar buiten, om te profiteren van de voordelen zoals meer configuratie bij elkaar te houden en gegevens porteerbaar te houden. Bij bestaande registraties kan het “urn”-veld geïntroduceerd worden als experiment.
Gebruik voor het URN-formaat, voor de “vaste lijsten”, bestaande registraties. Voor organisatie
zou dit een OIN kunnen zijn en voor resource
de naam van de (hoofd) resource uit de API (Zaken API: ZAAK, Klantinteracties API: PARTIJ, etc.).
Een aantal voorbeelden:
00000001002220647000:zrc:zaak:zaken-wonen:b67d13
00000001002220647000:zrc:zaak:zaken-sociaal:a8222b
00000001002308836000:zrc:zaak:burgerzaken:341fa9
00000001002308836000:kic:partij:kcc:7ef22c
00000001002308836000:kic:internetaak:kcc:9bb51a
Aanvullende adviezen
Transitie
Er zijn nu 2 constructies voor verwijzingen in gebruikt: URLs en Identificatoren. In principe kan aan beide constructies een “urn”-attribuut toegevoegd worden. Hiervoor zal wel per URL een mapping gemaakt moeten worden voor organisatie
en systeem
. De andere 2 fragmenten zouden te mappen moeten zijn zonder additionele gegevens. Bij Identificatoren zou de informatie allemaal aanwezig moeten zijn om de mapping geautomatiseerd te maken.
Advies: Voeg het “urn”-attribuut overal toe als experimenteel.
Waarden van het systeem
-fragment
Het systeem
-fragment is een flexibele waarde en kan dus van alles zijn. Het gevaar ligt op de loer om hier bijvoorbeeld de omgeving in op te nemen (bijvoorbeeld: openzaak-acceptatie-commutr
). Hoewel dit kan, zou dit een nadeel van URLs teniet doen omdat het meer een “locator” wordt. Gegevens migreren van test naar acceptatie, vergt dan weer een data migratie terwijl de configuratie van de client applicatie per omgeving simpelweg al kan verschillen waardoor het overbodig is om de omgeving vast te leggen in de URN.
Je zou ook een leverancier- of product naam kunnen opnemen in de URN. Dit lijkt wellicht handig maar als gekozen wordt voor een ander product met dezelfde API’s, dan komt natuurlijk de vraag om de URN ook aan te passen, waarmee je weer een data migratie nodig hebt.
Advies: Houd het systeem
-fragment leverancier en product agnostisch. Een afdeling of domein zou bijvoorbeeld wel kunnen.
Centraal register URN naar URL
Je kan er voor kiezen om een centrale “mapping” te maken en beschikbaar te stellen, binnen je organisatie, of zelfs landelijk. Dit is echter niet perse nodig en client applicatie zullen ten alle tijde deze informatie toch ook moeten opslaan omdat ze credentials nodig hebben.
Advies: Gebruik in eerste instantie enkel de client applicatie configuratie en kijk later of er behoefte is aan een centraal register.
URLs die verwijzen naar binnen en buiten
URLs worden nu gebruikt voor verwijzingen naar binnen de API (bijvoorbeeld een ZAAK met een STATUS) en voor verwijzingen naar buiten de API (bijvoorbeeld een ZAAK en een ZAAKTYPE).
Een client applicatie weet hoe het moet omgaan met een API als geheel. Verwijzingen naar binnen behoeven ook geen andere credentials dan die nodig waren voor het initiële object. Het gebruik van URLs is daarom niet nodig voor verwijzingen binnen dezelfde API. Het gebruik van URNs is dat om dezelfde reden ook niet. Enkel hetidentifier
-fragment zou genoeg moeten zijn. Hieronder bijvoorbeeld voor status
bij een ZAAK:
{
"urn": "utrecht:zaak:open-zaak-commutr:b67d13",
"uuid": "b67d13",
"zaakidentificatie": "ZAAK-0001",
"zaaktype": "utrecht:zrc:zaaktype:open-zaak-commutr:60aa32",
"status": "a431da",
...
}
Advies: Gebruik in eerste instantie URNs enkel voor verwijzingen naar buiten en kijk later of URLs in zijn geheel weg kunnen voor interne verwijzingen.
Last updated