-
Notifications
You must be signed in to change notification settings - Fork 3
/
architectuur.html
363 lines (313 loc) · 21.6 KB
/
architectuur.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
<!DOCTYPE html>
<html lang="nl">
<head>
<title>Business verantwoordelijke | Vlaanderen.be</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://dij151upo6vad.cloudfront.net/2.latest/css/vlaanderen-ui.css" />
<link rel="stylesheet" href="https://dij151upo6vad.cloudfront.net/2.latest/css/vlaanderen-ui-corporate.css" />
<link rel="stylesheet" href="css/customstyle.css" />
<link rel="icon" sizes="192x192" href="https://dij151upo6vad.cloudfront.net/2.latest/icons/app-icon/icon-highres-precomposed.png">
<link rel="apple-touch-icon" href="https://dij151upo6vad.cloudfront.net/2.latest/icons/app-icon/touch-icon-iphone-precomposed.png">
<link rel="apple-touch-icon" sizes="76x76" href="https://dij151upo6vad.cloudfront.net/2.latest/icons/app-icon/touch-icon-ipad-precomposed.png">
<link rel="apple-touch-icon" sizes="120x120" href="https://dij151upo6vad.cloudfront.net/2.latest/icons/app-icon/touch-icon-iphone-retina-precomposed.png">
<link rel="apple-touch-icon" sizes="152x152" href="https://dij151upo6vad.cloudfront.net/2.latest/icons/app-icon/touch-icon-ipad-retina-precomposed.png">
<meta name="msapplication-square70x70logo" content="https://dij151upo6vad.cloudfront.net/2.latest/icons/app-icon/tile-small.png" />
<meta name="msapplication-square150x150logo" content="https://dij151upo6vad.cloudfront.net/2.latest/icons/app-icon/tile-medium.png" />
<meta name="msapplication-wide310x150logo" content="https://dij151upo6vad.cloudfront.net/2.latest/icons/app-icon/tile-wide.png" />
<meta name="msapplication-square310x310logo" content="https://dij151upo6vad.cloudfront.net/2.latest/icons/app-icon/tile-large.png" />
<meta name="msapplication-TileColor" content="#FFE615" />
</head>
<body>
<!-- Start page content -->
<div class="page">
<div class="layout layout--wide">
<div class="skiplink">
<a href="#main">Overslaan en naar de algemene inhoud gaan</a>
</div>
</div>
<div style="min-height:44px;;" id="vlaanderen-header">
<!-- insert your global header here -->
<script type="text/javascript" src="//widgets.vlaanderen.be/widget/live/5ecf33a0a922428cb9d944c55362ed15"></script>
<!-- end global header-->
</div>
<header class="content-header " role="banner">
<div class="content-header__wrapper">
<picture>
<!--[if IE 9]>
<video style="display: none;"><![endif]-->
<source srcset="https://www.vlaanderen.be/sites/default/files/ip_acm/page_banner_wide_alt/header.jpg 1x" media="(min-width: 1024px)">
<source srcset="https://www.vlaanderen.be/sites/default/files/ip_acm/page_banner_mobile_alt/header.jpg 1x" media="(max-device-width: 767px)">
<source srcset="https://www.vlaanderen.be/sites/default/files/ip_acm/page_banner_narrow/header.jpg 1x" media="(max-width: 1023px)">
<!--[if IE 9]></video><![endif]-->
<!--[if lt IE 9]>
<img itemprop="image" src=//www.vlaanderen.be/sites/default/files/ip_acm/page_banner_wide_alt/header.jpg" alt="" title=""/><![endif]-->
<!--[if !lt IE 9]><!-->
<img src="https://www.vlaanderen.be/sites/default/files/ip_acm/page_banner_wide_alt/header.jpg" srcset="https://www.vlaanderen.be/sites/default/files/ip_acm/page_banner_mobile_alt/header.jpg 320w, //www.vlaanderen.be/sites/default/files/ip_acm/page_banner_narrow/header.jpg 1024w, //www.vlaanderen.be/sites/default/files/ip_acm/page_banner_wide_alt/header.jpg 1600w"
alt="" title="">
<!-- <![endif]-->
</picture>
<div class="layout layout--wide">
<div class="content-header__content">
<h1 class="content-header__title" itemprop="name">
<span class="content-header__title__content">Architecturale overwegingen</span>
</h1>
</div>
</div>
</div>
</header>
<div id="main" itemprop="mainContentOfPage" role="main" tabindex="-1" class="main-content">
<div class="region">
<div class="layout layout--wide">
<div class="grid">
<div class="col--8-12 col--12-12--s col--8-12--m">
<div class="content typography introduction" id="intro">
<p>Naast informatiemodellen leverde het OSLO project ook een <a href="https://overheid.vlaanderen.be/OSLO-URI-standaard" target="_blank">Vlaamse URI standaard</a> en een <a href="http://data.vlaanderen.be/sparql" target="_blank">Proof of Concept implementatie</a> op die gebruik maakt van Linked Data technologie als Triple Stores. Om de voordelen van OSLO en Linked Data ten volle te benutten is het noodzakelijk om ook in de informatie- en applicatiearchitectuur enkele overwegingen te maken.</p>
</div>
</div>
</div>
</div>
</div>
<div class="region">
<div class="layout layout--wide">
<div class="grid">
<div class="col--9-12 col--12-12--s col--8-12--m">
<div class="js-scrollspy__content">
<div class="u-spacer--large">
<!-- demo doormat component in grid -->
<ul class="grid grid--is-stacked js-equal-height-container">
<li class="col--4-12 col--6-12--m col--12-12--xs">
<a class="doormat js-equal-height" href="#sec1">
<h2 class="doormat__title" data-clamp="2">Gebruik van URI’s</h2>
<!-- <div class="doormat__text" data-clamp="3">Specifieke handleiding voor business verantwoordelijken.</div> -->
</a>
</li>
<li class="col--4-12 col--6-12--m col--12-12--xs">
<a class="doormat js-equal-height" href="#sec2">
<h2 class="doormat__title" data-clamp="2">Gebruik van NoSQL databases en Triplestores</h2>
<!-- <div class="doormat__text">Specifieke handleiding voor technische en funcionele analisten.</div> -->
</a>
</li>
<li class="col--4-12 col--6-12--m col--12-12--xs">
<a class="doormat js-equal-height" href="#sec3">
<h2 class="doormat__title" data-clamp="2">Gebruik van REST API’s</h2>
<!-- <div class="doormat__text">Specifieke handleiding voor technische en funcionele analisten.</div> -->
</a>
</li>
</ul>
<!-- end component -->
</div>
<div class="u-spacer--large">
<div class="u-spacer">
<h1 class="h1 u-named-anchor" id="sec1">Gebruik van URI's</h1>
<p>De <a href="https://overheid.vlaanderen.be/OSLO-URI-standaard" target="_blank">Vlaamse URI standaard</a> bepaalt dat wanneer een applicatie via een service data ontsluit, en deze data persistent moeten zijn, de vormregels zoals vastgelegd in de URI standaard gevolgd moeten worden. Dit houdt in dat de identificator voor de data objecten een URI moet zijn die het volgend patroon volgt: http(s)://{domein}/id/{concept}(/{referentie})*</p>
<br>
<div class="suggestie">
<strong>Verduidelijking:</strong> Wanneer moet mijn data persistent zijn en wanneer moet ik een URI als identificator gebruiken én ontsluiten?
<br>
<br>
<ul class="bullet-list bullet-list--check">
<li class="bullet-list__item">Is mijn organisatie de beheerder van het data object?</li>
<li class="bullet-list__item">Heeft het data object een waarde voor gebruikers van mijn toepassingen nadat deze klaar is met het bewerken of behandelen van het data object?</li>
<li class="bullet-list__item">Verlaat de data de grenzen van mijn applicatie, nu of in de toekomst, bijvoorbeeld in het kader van gegevensuitwisseling of de koppeling van applicaties?</li>
</ul>
<br>
Indien het antwoord op bovenstaande ‘ja’ is moet de applicatie gebruik maken van persistente URI’s in lijn met de Vlaamse URI standaard, voor het ontsluiten van data.
</div>
<div class="voorbeeld">
<strong>Voorbeeld:</strong> een URI ontsluiten als identificator voor mijn data.
<br>
<br>
Stel, je informatiemodel bestaat uit de volgende entiteiten (klassen): <strong>Gebouw</strong> en <strong>Energieprestatiecertificaat</strong>. De applicatie heeft als doel een centraal register uit te bouwen voor energieprestatiecertificaten.<br>
<br>
<strong>Object Gebouw:</strong> de beheerder van het data object gebouw en de bijbehorende informatie is het gebouwenregister. Aangezien ik niet de beheerder ben van dit data object kan ik de identificator (URI) voor een gebouw overnemen van het gebouwenregister, bijvoorbeeld: http://data.vlaanderen.be/id/gebouw/{referentie}
<br>
<br>
<strong>Object Energieprestatiecertificaat:</strong> mijn applicatie heeft als doel de centrale bron te zijn voor informatie m.b.t. Energieprestatiecertificaten, bijgevolg valt het toekennen van een URI als persistente identificator onder mijn verantwoordelijkheid (1). Nadat een energieprestatiecertificaat werd aangemaakt of bewerkt in de applicatie, moeten derden informatie over dit certificaat kunnen raadplegen aan de hand van de identificator van het Energieprestatiecertificaat, de identificator voor energieprestatiecertificaat moet dus persistent zijn aangezien het gebruikt wordt in toepassingen van derden (2). Tot slot moeten derden deze informatie rechtstreeks kunnen opvragen aan de hand van deze identificator (3).
<br>
<br>
<strong>Conclusie:</strong> mijn organisatie moet voorzien in persistente URI’s voor het ontsluiten van gegevens m.b.t. Energieprestatiecertificaten, deze worden gelinkt aan de bestaande URI’s voor gebouwen.
</div>
<div class="aanbeveling">
<strong>Aanbeveling:</strong> Wanneer in bovenstaand voorbeeld data over het energieprestatiecertificaat de applicatie niet verlaat is niet voldaan aan de derde voorwaarde voor het gebruik van persistente URI’s als identificator. Bijgevolg is het gebruik en beheer ervan niet verplicht. Echter, met het oog op toekomstbestendigheid kan het alsnog wenselijk zijn om URI’s als identificator op te nemen zonder ze dereferenceable te maken.
</div>
</div>
</div>
<div class="u-spacer--large">
<div class="u-spacer">
<h2 class="h2 u-named-anchor" id="case1">Doorverwijzen naar een beschrijving van de resource</h2>
<p>Regel 4.2 van de URI standaard stelt dat: “Voor elke URI van het type id moet een gelijkvormige URI van het type doc bestaan. Die doc- URI mag eventueel opnieuw één of meerdere keren doorverwijzen naar de URI waar het eigenlijke document zich bevindt. De URI van het uiteindelijke document hoeft zich niet noodzakelijk aan de vormregels te conformeren.”. In praktijk betekent dit dat de identificator (URI) van een data object kan gebruikt worden om rechtstreeks meer informatie over het object op te vragen, maar dat deze URI mag doorverwijzen naar een URI die niet noodzakelijk conform is met de URI standaard.</p>
<br>
<div class="voorbeeld">
<strong>Voorbeeld:</strong> doorverwijzing van /id naar /doc
<br>
<br>
http://data.vlaanderen.be/id/organisatie/1234 wordt gebruikt als identificator voor de organisatie Example NV. Wanneer deze URI zou worden ingevoerd in een browser, zou de gebruiker worden doorverwezen naar http://data.vlaanderen.be/doc/organisatie/1234 waar een beschrijving van deze organisatie te zien is. Een alternatief is dat deze URI voor de beschrijving van de organisatie opnieuw doorverwijst naar een derde URI, bijvoorbeeld http://example.com.
</div>
</div>
</div>
<div class="u-spacer--large">
<div class="u-spacer">
<h2 class="h2 u-named-anchor" id="case2">Gebruik van HTTP status codes</h2>
<p>Interpretatie van de HTTP status codes (bij gebruik URI’s als identificator):</p>
<br>
<ul class="bullet-list bullet-list--check">
<li class="bullet-list__item"><strong>2XX Success:</strong> de URI identificeert een web-document en is succesvol opgehaald.</li>
<li class="bullet-list__item"><strong>303 See Other:</strong> de URI identificeert een niet-informatieresource. Een object uit de reële wereld zoals een persoon of een gebouw die beschreven wordt aan de hand van een document op het web. De 303 HTTP status code wordt gebruikt om de gebruiker door te verwijzen naar een document dat het object beschrijft.</li>
<li class="bullet-list__item"><strong>410 Gone:</strong> het object waar de URI naar verwijst is verwijderd omdat het niet meer bestaat of omdat het niet meer beschikbaar is (bijvoorbeeld omdat de informatie is gearchiveerd).</li>
</ul>
<br>
<div class="voorbeeld">
<strong>Voorbeeld:</strong> gebruik van HTTP status codes
<br>
<br>
<p>Stel, Example NV is een bedrijf dat huisdieren verkoopt, meer bepaald konijnen. Example NV heeft een website, http://www.example.com/, het resolven van deze URI resulteert in een <strong>HTTP 200 OK</strong> response aangezien het om een web-document gaat.</p>
<br>
<p>Het bedrijf heeft momenteel twee konijnen in stock: Bob en Alice. Deze konijnen worden beschreven op de website: foto’s, naam, geslacht, herkomst,... en worden geïdentificeerd met behulp van onderstaande URIs:<br>
http://www.example.com/id/konijn/bob<br>
http://www.example.com/id/konijn/alice
</p>
<br>
<p>Deze URI’s resolven zal resulteren in een <strong>HTTP 303 See Other</strong> status code die de gebruiker respectievelijk verwijst naar onderstaande pagina's, waar de informatie met betrekking tot deze konijnen te vinden is:<br>
http://www.example.com/doc/konijn/bob<br>
http://www.example.com/doc/konijn/alice
</p>
<br>
<p>Wanneer Alice verkocht wordt, wil het bedrijf niet langer dat deze informatie te raadplegen is via hun website. Als een gebruiker na de verkoop toch nog informatie zou opvragen over het konijn Alice ontvangt deze een <strong>HTTP 410 Gone status</strong> code.</p>
</div>
</div>
</div>
<div class="u-spacer--large">
<div class="u-spacer">
<h2 class="h2 u-named-anchor" id="case3">Content Negotiation</h2>
<p>Content negotiation kan gebruikt worden om een persoon dan wel machineleesbare versie van het document weer te geven. Zo kan eenzelfde informatie object in HTML, JSON, RDF of ander formaat worden getoond. Meer informatie: <a href="https://docs.google.com/document/d/1-jVc87meU5glOqsqC0zwY1u-jQc_9aR9Y1xm6t0nc8w/edit?usp=sharing" target="_blank">URI-richtlijnen voor data.vlaanderen.be</a>.</p>
<br>
<div class="voorbeeld">
<strong>Voorbeeld:</strong> gebruik van content negotiation
<br>
<br>
Gebruiker vraagt een <strong>persoonleesbare versie</strong> op van het document:<br>
<br>
GET http://www.example.com/id/alice HTTP/1.1<br>
Host: www.example.com<br>
Accept: text/html<br>
Accept-Language: en, nl
<br>
<br>
Gebruiker vraagt een <strong>machineleesbare versie</strong> op van het document:
<br>
<br>
GET http://www.example.com/id/alice HTTP/1.1<br>
Host: www.example.com<br>
Accept: application/ld+json,application/rdf+xml<br>
Accept-Language: en, nl
</div>
</div>
</div>
<div class="u-spacer--large">
<div class="u-spacer">
<h1 class="h1 u-named-anchor" id="sec2">Gebruik van NoSQL databases en Triplestores</h1>
<p>Zie <a href="ontwikkelaar.html#case2" target="_blank">handreiking voor de ontwikkelaar</a>.</p>
</div>
</div>
<div class="u-spacer--large">
<div class="u-spacer">
<h1 class="h1 u-named-anchor" id="sec3">Gebruik van REST API's</h1>
<p>Zie <a href="ontwikkelaar.html#case1" target="_blank">handreiking voor de ontwikkelaar</a>.</p>
</div>
</div>
</div>
</div>
<div class="col--3-12 col--12-12--s col--4-12--m">
<nav class="side-navigation js-sticky js-scrollspy" data-scrollspy-mobile="Componenten" data-sticky-offset-top="25">
<div class="side-navigation__content">
<div class="side-navigation__group">
<ul>
<li class="side-navigation__item">
<a class="side-navigation__toggle" href="#sec1" data-child="parent-1">Gebruik van URI's</a>
<ul>
<li class="side-navigation__item">
<a href="#case1" data-parent="parent-1">Doorverwijzen naar een beschrijving van de resource</a>
</li>
<li class="side-navigation__item">
<a href="#case2" data-parent="parent-1">Gebruik van HTTP status codes</a>
</li>
<li class="side-navigation__item">
<a href="#case3" data-parent="parent-1">Content Negotiation</a>
</li>
</ul>
</li>
<li class="side-navigation__item">
<a class="side-navigation__item" href="#sec2">Gebruik van NoSQL databases en Triplestores</a>
</li>
<li class="side-navigation__item">
<a class="side-navigation__item" href="#sec3">Gebruik van REST API's</a>
</li>
</ul>
</div>
<div class="side-navigation__group">
<ul>
<li class="side-navigation__item"><a href="#handleidingen">Profielgebaseerde handleidingen</a>
</li>
<li class="side-navigation__item"><a href="architectuur.html">Architecturale overwegingen</a>
</li>
</ul>
</div>
<div class="side-navigation__group">
<ul>
<li class="side-navigation__item"><a href="index.html">Hoofdpagina handreiking</a>
</li>
</ul>
</div>
</div>
</nav>
</div>
</div>
</div>
</div>
<div class="region region--alt">
<div class="layout layout--wide">
<div class="u-spacer--large">
<h2 class="h2 u-named-anchor" id="handleidingen">Profielgebaseerde handleidingen</h2>
<!-- demo doormat component in grid -->
<ul class="grid grid--is-stacked js-equal-height-container">
<li class="col--4-12 col--6-12--m col--12-12--xs">
<a class="doormat js-equal-height" href="businessverantwoordelijke.html">
<h2 class="doormat__title" data-clamp="2">Business verantwoordelijke</h2>
<div class="doormat__text" data-clamp="3">Integreren van de informatiestrategie in een projectplan.
</div>
</a>
</li>
<li class="col--4-12 col--6-12--m col--12-12--xs">
<a class="doormat js-equal-height" href="analist.html">
<h2 class="doormat__title" data-clamp="2">Analist</h2>
<div class="doormat__text">Uitwerken van een informatiemodel op basis van de behoeften.
</div>
</a>
</li>
<li class="col--4-12 col--6-12--m col--12-12--xs">
<a class="doormat js-equal-height" href="ontwikkelaar.html">
<h2 class="doormat__title" data-clamp="2">Ontwikkelaar</h2>
<div class="doormat__text" data-clamp="3">Implementeren van semantische afspraken in elektronische diensten.
</div>
</a>
</li>
</ul>
<!-- end component -->
</div>
</div>
</div>
</div>
</div>
<!-- End page content -->
<div id="vlaanderen-footer">
<!-- insert your Vlaanderen-footer-code here -->
<script src="//widgets.vlaanderen.be/widget/live/d6d44414e7c242f396ab6da8f8da5198" type=
"text/javascript">
<![CDATA[]]>
</script> <!-- End global footer-->
</div>
<script src="https://dij151upo6vad.cloudfront.net/2.latest/js/vlaanderen-ui.js"></script>
</body>
</html>