REST API Richtlijnen

VDIP Standaard
Werkversie

Laatst gepubliceerde versie:
https://vdip.pages.vlaamseoverheid.ghe.com
Redacteurs:
Laurens Debackere (Digitaal Vlaanderen)
Dimitry Declercq (Digitaal Vlaanderen)
Auteur:

Status van dit document

Dit is een werkversie die op elk moment kan worden gewijzigd, verwijderd of vervangen door andere documenten. Het is geen door het Architecture Board goedgekeurde consultatieversie.

Conformance

As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.

The key words MAY, MUST en SHOULD in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.

Het doel van deze standaard is om een afsprakenkader aan te bieden waar REST APIs binnen het Vlaams Data Integratie Platform (VDIP) aan moeten voldoen, met het oog op consistentie, interoperabiliteit en eenvoud voor implementatie en integratie van de API.

De belangrijkste regel

Wees pragmatisch en gebruik je gezond verstand.

Dit is een collectie richtlijnen met als doel een eenvormigheid in een architecturale stijl te realiseren. Het is geen allesomvattende codex met gedetailleerde regels voor alle mogelijke problemen.

'Comply or explain' principe

Naleven of uitleggen ('comply or explain') is een regelgevende benadering op het gebied van corporate governance en financieel toezicht. In plaats van bindende regels op te stellen, wordt een richtlijn opgesteld, die de teams kunnen naleven of, indien zij dat niet doen, publiekelijk uitleggen waarom zij dat niet doen.

Het doel van "naleven of uitleggen" is de teams te laten beslissen of een reeks normen geschikt is voor individuele softwareontwikkelingen binnen de context van het product waar ze aan werken. Aangezien een team mag afwijken van de norm, verwerpt deze aanpak de opvatting dat "one size fits all".

Als betrokken stakeholders, waaronder het Architectuur Board, de uitleg echter niet accepteren mag de afwijking van de norm niet worden geïmplementeerd.

Noot

Opbouw van de richtlijnen

De richtlijnen zijn opgebouwd in verschillende secties, elk gericht op een specifiek aspect van REST API-ontwerp en -ontwikkeling. Er is getracht een logische volgorde aan te houden om een geleidelijke verdieping te bieden, te starten van algemene principes voor API en REST design. Daarna de algemene richtlijnen over documentatie en API-ontwerp, gevolgd door richtlijnen rond gebruik van HTTP Headers, Foutenafhandeling en Beveiliging. Nadien wordt er dieper ingegaan op de inhoudelijke data formaten en vormvereisten (bijv. correct gebruik van standaard data typen, OSLO formaten, ...).

1. Terminologie

REST API
een op HTTP gebaseerde API die resource-gebaseerde interacties aanbiedt met standaard HTTP-semantiek.
OpenAPI Specification (OAS)
Het specificatieformaat voor REST API's dat als standaard is vastgesteld door de OpenAPI Initiative.
API-implementatie
De implementatie van de API als onderdeel van een concrete service-implementatie. Dit is doorgaans code geschreven in een programmeertaal zoals Java of Python, en er kunnen meerdere concrete implementaties voor dezelfde API bestaan.
Resource
Een resource is een abstractie van een conceptuele entiteit, geïdentificeerd door een globaal unieke URI, waarvan de huidige toestand via een of meer representaties naar clients kan worden overgedragen.
Enkelvoudige resource
Een enkelvoudige resource is een resource die overeenkomt met één conceptuele entiteit (bijvoorbeeld een gebouw, persoon of gebeurtenis).
Collectie-resource
Een collectie-resource is een resource die overeenkomt met een logische groepering van gerelateerde resources en verwijzingen (URI's) bevat naar de afzonderlijke enkelvoudige resources die erin zijn opgenomen (bijvoorbeeld een lijst van gebouwen).
URI
Een URI [RFC3986] (Uniform Resource Identifier) is een tekenreeks die een resource identificeert. URI's zijn bedoeld om uniek te zijn op het web, zodat resources eenduidig kunnen worden gerefereerd.
ACM
ACM is onderdeel van de [Vlaamse Veiligheidsbouwstenen](https://www.vlaanderen.be/digitaal-vlaanderen/onze-diensten-en-platformen/veiligheidsbouwstenen) en voorziet [toegangsbeheer](https://www.vlaanderen.be/digitaal-vlaanderen/onze-diensten-en-platformen/veiligheidsbouwstenen/toegangsbeheer) voor [APIs](https://authenticatie.vlaanderen.be/docs/beveiligen-van-api/oauth-rest/rest-server2server/), webtoepassingen en mobiele apps via OAuth, OIDC en SAML.

2. Toepassingsgebied

Deze standaard definieert normatieve REST design rules voor gesloten machine-to-machine gegevensuitwisseling tussen overheidspartijen binnen VDIP.

De sleutelwoorden MOET en MOETEN in dit document hebben een normatieve betekenis zoals beschreven in het Engels in [RFC2119] indien in hoofdletters geschreven.

3. Principes

3.1 Principes voor API-ontwerp

In vergelijking met de SOA-WebService stijl van SOAP versus REST, is de eerste doorgaans gericht op operaties die meestal use-case-specifiek en gespecialiseerd zijn volgens een patroon van remote procedure calling. REST daarentegen is gericht op business (data-)entiteiten die als resources worden blootgesteld, geïdentificeerd via URI’s, en gemanipuleerd kunnen worden via gestandaardiseerde CRUD-achtige methoden met verschillende representaties en hypermedia.

RESTful API’s zijn doorgaans minder use-case-specifiek, hebben een minder strakke client/server-koppeling en zijn beter geschikt voor een ecosysteem van (kern)services die een API-platform bieden om uiteenlopende nieuwe businessservices op te bouwen. We passen RESTful webserviceprincipes toe op alle soorten (micro)servicecomponenten.

Een belangrijk principe voor API-ontwerp en -gebruik is Postel’s Law, aka "The Robustness Principle" (zie ook [RFC1122]):

3.2 Richardson maturiteitsmodel

Het Richardson maturiteitsmodel catalogeert de hoofdelementen van een RESTful interface in drie niveau’s. Om volledig in lijn te zijn met het REST uniform interface model van Roy Fielding moet aan alle niveau’s voldaan worden.

  1. Resources. Omvat het opdelen van een service endpoint in resources die elk bepaald worden door een unieke URI

  2. HTTP methods: Het gebruik van een standaard set van HTTP methods zodat vergelijkbare situaties op een uniforme manier behandeld worden zodat onnodige variaties vermeden worden

  3. Hypermedia elementen: introduceert zelfbeschrijvende documentatie en vindbaarheid

VDIP REST API’s MOETEN minstens niveau 2 respecteren en proberen bij voorkeur ook te voldoen aan de voorwaarden van niveau 3.

Aanbevolen lectuur over RESTful API-ontwerp en service-architectuur:

3.3 API als product

API’s zijn volwaardige producten ('first class citizens') en dienen als dusdanig behandeld te worden. Het is een kern-product van het VDIP platform. Als organisatie willen we producten bouwen voor interne en externe afnemers die als een dienst kunnen geconsumeerd worden.

Platformproducten bieden hun functionaliteit via (publieke) API’s. Daarom hoort het ontwerp van API’s gebaseerd te zijn op het principe “API as a Product”:

Het omarmen van “API as a Product” bevordert een service-ecosysteem dat makkelijker kan evolueren en snel kan experimenteren met nieuwe businessideeën door kerncapaciteiten te hercombineren.

Begrijp de concrete use-cases van je klanten en weeg de ontwerpvarianten zorgvuldig af met een productmindset. Vermijd kortetermijnoptimalisaties in de implementatie als die onnodige verplichtingen aan clientzijde veroorzaken, en besteed veel aandacht aan API-kwaliteit en de developer experience voor de klanten.

“API as a Product” hangt nauw samen met het “API First”-principe (zie volgende sectie), dat meer focust op hoe hoogwaardige API’s engineeringmatig worden gerealiseerd.

3.4 API first

API First is een belangrijk engineering- en architectuurprincipe. In essentie vraagt API First om twee zaken:

Door API’s buiten de code te definiëren, wordt vroege reviewfeedback mogelijk gemaakt en ontstaat een ontwikkelingsdiscipline die service-interfaceontwerp richt op:

Bovendien maken API-specificaties in een standaardformaat het volgende mogelijk:

Onderdelen van API First zijn ook deze API-richtlijnen en een gestandaardiseerd API-reviewproces om vroegtijdig feedback van peers en clientontwikkelaars te krijgen. Peer review is belangrijk om API’s van hoge kwaliteit te maken, architecturale en ontwerpafstemming mogelijk te maken, en ontwikkeling van clientapplicaties los te koppelen van de engineeringlevenscyclus van de serviceprovider.

Belangrijk is dat API First niet in conflict is met agile ontwikkelprincipes, maar dit complementeert. Serviceapplicaties horen incrementeel te evolueren, en hun API’s ook. De API-specificatie zal en moet iteratief evolueren in verschillende cycli; telkens startend met een draftstatus en vroege team- en peerreviewfeedback. API’s mogen veranderen en profiteren van implementatie-inzichten en feedback uit geautomatiseerde tests.

API-evolutie tijdens de ontwikkelcyclus kan breaking changes bevatten voor nog niet-productieve features, zolang wijzigingen met clients afgestemd zijn. API First betekent dus niet dat je 100% domein- en requirementbegrip moet hebben en nooit code mag schrijven voordat de volledige API is gedefinieerd en bevestigd via peer review.

Anderzijds is API First duidelijk in strijd met de slechte praktijk om API-specificaties pas te publiceren en om peer review te vragen nadat service-integratie, of zelfs productiegebruik, al gestart is. Vroege feedback vragen en krijgen is cruciaal: zo vroeg mogelijk, maar niet voordat API-wijzigingen voldoende samenhang en kwaliteit hebben (inclusief naleving van API-richtlijnen), al bevestigd via interne teamreviews.

VDIP REST API's MOETEN volgens het API first principe worden ontwikkeld.

3.5 Best practices

4. Richtlijnen

API First /core/api-first

Je MOET het API First-principe volgen, meer bepaald:

API scope /core/api-scope

Een API MOET een set resources bundelen die functioneel gerelateerd zijn en een autonome eenheid van business logic vormen.

API maturiteit /core/api-maturity

Alle REST APIs MOETEN minstens een Richardson maturiteitsmodel niveau 2 respecteren en proberen bij voorkeur ook te voldoen aan de voorwaarden van niveau 3.

Breek backward compatibility niet /core/backward-compatibility

Breek backward compatibility niet binnen een gepubliceerde major API-versie.

Vermijd onder meer:

Nieuwe functionaliteit MOET op een backwards compatibel manier toegevoegd worden (bijv. nieuwe optionele velden of endpoints). Breaking changes vereisen een nieuwe major versie (bijv. /v2).

Richtlijnen zijn evolutief /core/guidelines-evolution

Deze richtlijnen evolueren over tijd. Een REST-dienst wordt ontwikkeld conform de versie van de richtlijnen die geldt op het moment van ontwikkeling.

5. REST API Documentatie

API Specificatie in OpenAPI /docs/api-spec-openapi

Elke API heeft een API specificatie document:

Opmerking: Het gepubliceerde OpenAPI document is self-contained, het bronbestand mag verwijzen naar externe bestanden maar moet bij publicatie worden samengevoegd tot een self-contained document. Zie ook de regel Gebruik alleen duurzame en onveranderlijke externe referenties.

Opmerking: Bij het gebruik van Linked Data (JSON-LD, RDF, ...) kunnen er externe referenties gebruikt worden naar de informatie modellen, als deze een duurzame en onveranderlijke externe referentie zijn. Het verdient echter de aanbeveling om ook deze referenties in de API specificatie mee te publiceren.

Gebruik alleen duurzame en onveranderlijke externe referenties /docs/duurzame-referenties

Het gepubliceerde OpenAPI-document MOET op zichzelf staan, d.w.z. bestanden mogen geen verwijzingen bevatten naar lokale of externe inhoud, bijvoorbeeld ../fragment.yaml#/element of $ref: 'https://vdip.pages.vlaamseoverheid.ghe.com/specifications/rest/model/my-common-model.yaml#/schemas/Request'. De reden hiervoor is dat de inhoud waarnaar extern wordt verwezen niet als duurzaam en niet onveranderlijk kan beschouwd worden. Als gevolg hiervan kan de semantiek van een API op onverwachte manieren veranderen.

Het bronbestand mag tijdens ontwikkeling verwijzen naar externe bestanden, maar moet bij publicatie worden samengevoegd tot een self-contained document. Het wordt zelfs aanbevolen om externe referenties te gebruiken tijdens de ontwikkelcyclus van een API, om hergebruik van API-fragmenten mogelijk te maken en om de onderhoudbaarheid van de API-specificatie te verbeteren. Bv, de herbruikbare API-fragmenten van VDIP die beschikbaar zijn via: https://vdip.pages.vlaamseoverheid.ghe.com/specifications/rest/model/{model.yaml}

Schrijf APIs in de correcte taal voor het doelpubliek /docs/correct-taalgebruik-voor-api

Er wordt (waar nodig) gebruik gemaakt van het use-mention-onderscheid.

Business termen worden niet vertaald en blijven in originele taal van het informatie-model behouden, dit geldt in het bijzonder voor termen waar er geen correcte vertalingen voor zijn en die bv gebruikt worden in paden, parameters en body.

Gebruikersdocumentatie /docs/gebruikersdocumentatie

Naast de API-specificatie is het een best practice om ook een API-gebruikershandleiding aan te bieden. Dat verbetert de developer experience aan klantzijde, zeker voor engineers met minder ervaring met deze API. Een nuttige API-gebruikershandleiding beschrijft doorgaans de volgende aspecten:

De gebruikershandleiding moet online gepubliceerd worden, bijvoorbeeld via onze documentatiesite op Confluence. Vergeet niet om in de API-specificatie een link naar de API-gebruikershandleiding op te nemen via de #/externalDocs/url-property.

Metadata van de API beschrijven /docs/api-metadata

De volgende minimaal vereiste metadata over de API MOETEN worden beschreven in de OpenAPI-specificatie:

Versie van de richtlijnen documenteren /docs/guidelines-version

De OpenAPI-specificatie MOET via een extensie aangeven tegen welke versie van de VDIP REST-richtlijnen de API is ontwikkeld. Gebruik hiervoor het veld x-guidelines-version op het top-level info-object.

De waarde MOET de gepubliceerde versie van de richtlijnen zijn in semantic versioning formaat (bijv. "1.0.0").

Voorbeelden toevoegen aan OpenAPI /docs/voorbeelden

Voeg voorbeelden toe aan een OpenAPI-document.

Voorbeelden moeten worden opgegeven onder de OpenAPI-eigenschappen example of examples, en niet in een beschrijving. examples maakt het mogelijk om meerdere voorbeelden op te geven, maar kan niet worden gebruikt binnen schema-definities.

Voorbeeldwaarden moeten schema-valid zijn.

Definitie van componenten /docs/components

Het dupliceren van definities (schema's, reacties, parameters, enz.) dient vermeden te worden. Definieer ze liever één keer onder componenten, van waaruit ze kunnen worden aangeroepen (met $ref).

Alle componentnamen dienen in U.S. Engels worden gedefinieerd en de UpperCamelCase notatie gebruiken. Ook voor afkortingen geldt dat alle letters behalve de eerste in kleine letters moeten worden geschreven.

Gebruik geen underscores (_), koppeltekens (-) of punten (.) in een componentnaam, en gebruik geen cijfer als eerste letter.

6. REST URL Vormrichtlijnen

Onderdeel Richtlijn
URL Een REST-URL wordt geformatteerd als {protocol}://{hostname}/{prefix}/{version}/{resource}/{identifier}.
Gebruik geen hoofdletters in REST-URL's.
URL {prefix} Een optionele pad prefix voor de REST diensten, te gebruiken wanneer dit nodig is om onderscheid te maken tussen andere type resources.
URL {hostname} De hostname voor REST diensten is steeds de publieke API Gateway.
URL {protocol} Gebruik altijd HTTPS.
Gebruik TLS 1.3 bij voorkeur, minimaal TLS 1.2.
URL {version} Neem de API-versie op in de URL.
Noteer versies als kleine letter v gevolgd door een nummer (bijv. v1, v2, v14).
Gebruik in de URL enkel major versies; minor/patch kan via header X-Version volgens semantic versioning: vMAJOR.MINOR.PATCH.
URL {resource} Gebruik resource-namen in het meervoud.
Gebruik binnen de URI geen resource-naam id, doc of ns.
URL {identifier} Een resource-identifier is exact één unieke sleutel (eventueel samengesteld) die één resource identificeert.
De sleutel moet semantisch coherent zijn: dezelfde sleutel verwijst door de tijd naar hetzelfde object.
Gebruik geen URI als identifier in het pad. Gebruik bij voorkeur GUID's, long integers of stabiele domeinidentificatoren (zoals ISBN, CAPA key, rijksregisternummer).
URL formatting Gebruik geen fragmenten (#) in API-URL's.
Gebruik geen underscores (_) of punten (.) in resource-segmenten; gebruik koppeltekens (-).
Gebruik geen betekenisvolle trailing slash (/).
Gebruik geen file-extensies als betekenisvol onderdeel van de REST-URL.

Gebruik niet /api als basis pad /url/geen-api-basis-pad

Gebruik bij voorkeur de root (/) als base path voor publieke API-resources. /api voegt meestal geen extra semantiek toe en leidt vaak tot redundantie in URL's.

Gebruik enkel een expliciet basispad als je meerdere duidelijk verschillende API-contexten op dezelfde host moet scheiden.

Gebruik meervoud als resource naam /url/meervoud-resource-naam

Gebruik meervoudige resource-namen in paden, omdat een resource-segment in REST doorgaans een collectie voorstelt.

Enkel singleton-resources, zonder collectie-karakter, kunnen in het enkelvoud staan (bv /profile-picture of /status)

Zorg voor correcte meervoudsvormen, vooral bij onregelmatige zelfstandige naamwoorden (bijv. person → people, niet persons).

Gebruik URL-friendly resource identifiers /url/url-friendly-identifiers

Resource identifiers in het pad moeten URL-safe, stabiel en voorspelbaar zijn. Gebruik bij voorkeur identifiers met enkel onbetwiste URL-tekens (letters, cijfers, -, _, ., ~) en vermijd spaties of gereserveerde URL-tekens zoals /, ?, #.

Identifiers zijn bij voorkeur opaak: encodeer geen business-semantiek die doorheen de tijd kan veranderen.

Gebruik kebab-case voor pad segmenten /url/kebab-case-padsegmenten

Gebruik lowercase kebab-case voor alle padsegmenten.

Dit verhoogt leesbaarheid en consistentie over API's heen.

Gebruik lowerCamelCase voor path parameter namen /url/camelcase-pad-parameters

Path parameter namen (template variabelen) MOET lowerCamelCase gebruiken.

Dit sluit aan bij de naamgeving van JSON properties en verbetert de consistentie bij code-generatie.

Overweeg het gebruik van (niet-)geneste URL's /url/geneste-urls

Gebruik geneste URL's wanneer een child-resource enkel betekenis heeft binnen de context van een parent-resource. Gebruik niet-geneste URL's voor resources met een eigen levenscyclus of wanneer je dezelfde resource ook buiten die parent-context wil opvragen.

Houd nesting beperkt (bij voorkeur maximaal 2 tot 3 niveaus) om URL-complexiteit te beperken.

Voorbeelden:

Geen file extensions in URL's /url/geen-file-extensions

Vermijd het gebruik van file extensions (zoals .json, .xml) in REST-URL's als betekenisvol onderdeel van de resource-identificatie. Content negotiation via HTTP headers (bijv. Accept) is de aanbevolen manier om het gewenste responseformaat aan te geven, in plaats van verschillende URL's voor verschillende formaten.

7. REST HTTP Headers

In deze sectie lichten we een handvol (standaard) HTTP-headers toe, die we in bepaalde situaties het nuttigst vonden en die extra uitleg vereisen om ze effectief te gebruiken.

7.1 Gebruik van standaard headerdefinities

Doorgaans kun je de standaarddefinities voor HTTP request- en responseheaders gebruiken die door de richtlijn worden aangeboden, om de API te vereenvoudigen met algemeen herkenbare patronen. De best practice voor het importeren van headers met de hoogste leesbaarheid is als volgt:

paths:
  /resource:
    get:
      parameters:
        - $ref: '#/components/parameters/ETag'

components:
  parameters:
    ETag:
      $ref: 'https://vdip.pages.vlaamseoverheid.ghe.com/specifications/rest/models/headers-1.0.0.yaml#/ETag'

  responses:
    Default:
      headers:
        ETag:
          $ref: '#/components/parameters/ETag'

Gebruik standaard headers /headers/standaard-headers

API's mogen HTTP-headers gebruiken die gedefinieerd zijn door niet-verouderde RFC's (zie de lijst met standaard HTTP-headers).

Ondersteunde headers moeten expliciet worden gedocumenteerd in de API-specificatie.

Gebruik kebab-case met hoofdletters voor afzonderlijke woorden in HTTP-headers /headers/kebab-case-headers

Volg de naamgevingsconventie voor headers die door de meeste standaard headers wordt gebruikt (bijvoorbeeld in [RFC2616], [RFC4229], [RFC9110]).

Voorbeelden:

If-Modified-Since
Accept-Encoding
Content-ID
Language

Opmerking: HTTP-velden zijn niet hoofdlettergevoelig (zie [RFC9110] Section 5.1). Gebruik de bovenstaande conventie voor leesbaarheid en consistentie. Gangbare afkortingen zoals ID zijn aanvaardbare uitzonderingen.

Gebruik Content-* headers correct /headers/content-headers

Content-* headers beschrijven de representatie in de message body en kunnen voorkomen in requests en responses.

Gebruik ze volgens hun HTTP-semantiek, inclusief:

  • Content-Disposition kan aangeven dat de representatie als bestand moet worden opgeslagen, en de voorgestelde bestandsnaam.
  • Content-Encoding geeft compressie- of encryptiealgoritmen aan die op de content zijn toegepast.
  • Content-Length geeft de lengte van de content aan (in bytes).
  • Content-Language geeft aan dat de body bedoeld is voor mensen die een bepaalde menselijke taal/talen beheersen.
  • Content-Location geeft aan waar de body anders gevonden kan worden (Location header moet in plaats daarvan worden gebruikt!).
  • Content-Range wordt gebruikt in responses op range requests om aan te geven welk deel van de opgevraagde resource-representatie met de body wordt geleverd.
  • Content-Type geeft het mediatype van de bodycontent aan.

Gebruik Content-* headers niet als generieke metadata-dragers buiten hun door RFC gedefinieerde betekenis.

7.2 Idempotency-Key

Overweeg ondersteuning voor de Idempotency-Key header /headers/idempotency-key

Bij het aanmaken of bijwerken van resources kan het nuttig of noodzakelijk zijn om sterk idempotent gedrag te garanderen, inclusief dezelfde responses, om dubbele uitvoering te voorkomen bij retries na time-outs en netwerkstoringen. In het algemeen kan dit worden bereikt door een clientspecifieke unieke request key - die geen deel uitmaakt van de resource - via de Idempotency-Key header mee te sturen.

De unieke request key wordt tijdelijk opgeslagen, bijvoorbeeld gedurende 24 uur, samen met de response en (optioneel) de request-hash van het eerste request in een key-cache, ongeacht of dit succesvol was of faalde. De service kan nu de unieke request key opzoeken in de key-cache en de response uit de key-cache serveren, in plaats van het request opnieuw uit te voeren, om idempotent gedrag te waarborgen. Optioneel kan de service de request-hash op consistentie controleren voordat de response wordt geserveerd. Als de key niet in de key-store staat, wordt het request zoals gebruikelijk uitgevoerd en wordt de response opgeslagen in de key-cache.

Dit maakt het mogelijk voor clients om requests veilig te herhalen na time-outs, netwerkstoringen, enz., terwijl ze meerdere keren dezelfde response ontvangen.

Opmerking: De request retry in deze context vereist dat exact hetzelfde request wordt verstuurd, d.w.z. wijzigingen aan het request die het resultaat veranderen zijn niet toegestaan. De request-hash in de key-cache kan bescherming bieden tegen dit misbruik. Het wordt aanbevolen dat de service een dergelijk request afwijst met statuscode 400.

Belangrijk: Om betrouwbare idempotente uitvoeringssemantiek te garanderen, moeten de resource en de key-cache met harde transactiesemantiek worden bijgewerkt - rekening houdend met alle mogelijke valkuilen van fouten, time-outs en gelijktijdige requests in een gedistribueerd systeem. Dit maakt een correcte implementatie, die de lokale context overstijgt, zeer moeilijk.

De Idempotency-Key header moet als volgt worden gedefinieerd, maar je bent vrij om je eigen vervaltijd te kiezen:

components:
  headers:
    Idempotency-Key:
      $ref: 'https://vdip.pages.vlaamseoverheid.ghe.com/specifications/rest/models/headers-1.0.0.yaml#/Idempotency-Key'

Zorg ervoor dat je de vervaltijd van de idempotency key documenteert

7.3 X-Correlation-ID en X-Request-ID

De X-Correlation-ID (CorrelationId) en X-Request-ID (RequestId) maken het mogelijk om een set van berichten gekoppeld aan een transactie of een uniek bericht binnen een transactie te identificeren.

Het onderstaande schema toont hoe deze 2 waarden worden gebruikt:

ServiceBServiceAClientServiceBServiceAClientRequest (X-Correlation-ID: abc123, X-Request-ID: req1)Request (X-Correlation-ID: abc123, X-Request-ID: req2)Response (X-Correlation-ID: abc123, X-Request-ID: req2)Response (X-Correlation-ID: abc123, X-Request-ID: req1)

Door beide waarden te gebruiken, kunnen specifieke berichten worden getraceerd. In het geval van fouten of vragen kan:

CorrelationId toevoegen aan de request /headers/correlation-id

Een CorrelationId groepeert 1 of meer berichten in een transactie, waardoor berichten doorheen meerdere systemen kunnen worden getraceerd.

In de request-header wordt een X-Correlation-ID meegestuurd, in het formaat van een UUIDv4 (bv. a6d87d0e-2454-4501-8110-ecc082aa975f).

De waarde in de X-Correlation-ID-header in de response die wordt teruggestuurd, moet gelijk zijn aan de waarde in de request.

RequestId toevoegen aan de request /headers/request-id

Een RequestId identificeert elk request op een unieke manier, waardoor exacte berichten binnen transacties nauwkeurig kunnen worden aangewezen, bijvoorbeeld voor support.

In de request-header wordt een X-Request-ID meegestuurd, in het formaat van een UUIDv4 (bv. 0d1e63a3-b635-4d50-ba7f-34b7176defdf).

De waarde in de X-Request-ID-header in de response die wordt teruggestuurd, moet gelijk zijn aan de waarde in de request (als deze aanwezig is). Als er geen X-Request-ID in de request aanwezig is, dan moet de service een eigen X-Request-ID genereren en terugsturen in de response.

8. REST Request & Response

8.1 Request

Gebruik de correcte HTTP methoden /request/http-methoden

HTTP methoden MOETEN gebruikt worden volgens hun standaard semantiek:

Method Safe Idempotent Request body Response body Primair gebruik
GET Ja Ja Nee Ja Ophalen van een resource
POST Nee Nee Meestal Meestal Aanmaken of verwerken
PUT Nee Ja Ja Optioneel Volledige vervanging
PATCH Nee Nee Ja Optioneel Gedeeltelijke update
DELETE Nee Ja Nee Optioneel Verwijderen
HEAD Ja Ja Nee Nee Bestaan van metadata controleren
OPTIONS Ja Ja Nee Ja Beschikbare methoden opvragen
  • GET: leesoperatie zonder state change.
  • POST: aanmaken van een nieuwe resource of een command-achtige actie. Bij aanmaken geeft de server 201 Created terug met de URL van de nieuwe resource in de Location-header.
  • PUT: volledige vervanging van een bestaande resource. De client levert alle velden aan; ontbrekende optionele velden vallen terug op de standaardwaarden.
  • PATCH: partiële update via JSON Merge Patch ([RFC7396]). Velden met null worden verwijderd; afwezige velden blijven ongewijzigd.
  • DELETE: verwijderen van een resource.
  • HEAD: identiek aan GET, maar zonder response body. Nuttig om het bestaan van metadata van een resource te controleren.
  • OPTIONS: geeft de toegelaten methoden voor een resource terug via de Allow-header.

Gebruik geen GET voor operaties met side-effects en vermijd tunneling van methoden via query parameters.

Gebruik lowerCamelCase voor query parameters /url/camelcase-query-params

lowerCamelCase MOET gebruikt worden voor alle query parameters.

  • correct: ?fieldName=foo, ?pageSize=123
  • vermijd: ?field-name=foo, ?field_name=foo, ?FieldName=foo

Dit sluit aan bij de naamgeving van JSON properties en verhoogt consistentie voor API-consumers.

Herhalende query parameters /request/herhalende-params

Array-achtige queryparameters MOETEN in de herhalende (exploded) vorm worden opgegeven, conform [RFC6570] sectie 3.2.8.

Gebruik:

  • ?status=actief&status=gepauzeerd
  • ?id=123&id=456&id=789

Definieer dit expliciet in OpenAPI met style: form en explode: true.

Blijf bij de standaard geaccepteerde query parameters /url/standaard-query-params

Gebruik waar mogelijk de gangbare query-parameternamen met hun conventionele betekenis:

  • q: vrije zoekquery (filtering op tekst)
  • sort: sorteervolgorde (bijv. naam,-aangemaaktOp)
  • fields: projection/selectie van responsevelden
  • embed: inline opnemen van gerelateerde resources
  • offset en limit: offset-based paginatie

Introduceer geen nieuwe parameternaam als een standaardparameter hetzelfde doel dekt.

8.2 REST HTTP-statuscodes

Gebruik officiële HTTP-statuscodes /request/officiele-statuscodes

Je mag uitsluitend officiële HTTP-statuscodes gebruiken, en dat consistent met hun bedoelde semantiek. Officiële HTTP-statuscodes zijn gedefinieerd via RFC-standaarden en geregistreerd in de IANA Status Code Registry. De belangrijkste RFC-standaarden zijn [RFC9110] HTTP Semantics, sectie 15: Status Codes en [RFC6585] HTTP: Additional Status Codes.

Gebruik alleen de meest voorkomende HTTP-statuscodes /request/meest-voorkomende-codes

De meest gebruikte codes worden het best begrepen; vermijd minder vaak gebruikte codes die gemakkelijk misverstanden veroorzaken door minder vertrouwde semantiek en API-specifieke interpretaties.

Belangrijk: zolang je gebruik van HTTP-statuscodes goed gedekt is door de hier gedefinieerde semantiek, hoef je dit niet te beschrijven, om overbelasting met vanzelfsprekende informatie en het risico op inconsistente definities te vermijden. Alleen als de HTTP-statuscode niet in de onderstaande lijst staat, of als het gebruik ervan extra informatie vereist naast de goed gedefinieerde semantiek, moet de API-specificatie een duidelijke beschrijving van de HTTP-statuscode in de response geven.

Bij twijfel over het correcte gebruik van een HTTP-statuscode, raadpleeg [RFC9110].

Gebruik de meest specifieke HTTP-statuscodes /request/meest-specifieke-codes

De meest specifieke HTTP-statuscode MOET gebruikt worden wanneer je informatie teruggeeft over de verwerkingsstatus van een verzoek of over foutsituaties.

Noot

Gebruik code 429 met Retry-After header voor rate limiting /request/rate-limit

API's die de request rate van clients willen beheren, MOETEN responsecode 429 (Too Many Requests) gebruiken als de client de request rate heeft overschreden (zie [RFC6585]).

De response MOET een Retry-After header bevatten met ofwel een vertraging in seconden (delta-seconds), ofwel een HTTP-date waarop de client opnieuw mag proberen (zie [RFC9110] sectie 10.2.3).

HTTP/1.1 429 Too Many Requests
Retry-After: 60
Content-Type: application/problem+json

Communiceer rate limit quota via RateLimit-Policy en RateLimit headers /request/rate-limit-headers

API's die rate limiting toepassen, KUNNEN de in draft-ietf-httpapi-ratelimit-headers voorgestelde RateLimit-Policy en RateLimit headers gebruiken.

Voorbeeld: enkelvoudige policy

HTTP/1.1 200 OK
RateLimit-Policy: "default";q=100;w=60
RateLimit: "default";r=75;t=45

Interpretatie: de client mag 100 requests per 60 seconden; er resten nog 75 requests in de komende 45 seconden.

Voorbeeld: meervoudige policies (multi-level rate limiting)

Bij complexe rate limiting op meerdere niveaus (bv. API-breed, per client en per IP) kunnen alle policies in dezelfde headers worden gecommuniceerd:

HTTP/1.1 200 OK
RateLimit-Policy: "api";q=60;w=1, "client";q=30;w=1;pk=:Y2xpZW50LTQy:, "ip";q=30;w=1;pk=:MTAuMC4wLjE=:
RateLimit: "api";r=58;t=1, "client";r=28;t=1;pk=:Y2xpZW50LTQy:, "ip";r=30;t=1;pk=:MTAuMC4wLjE=:

Voorbeeld: 429 response met rate limit informatie

HTTP/1.1 429 Too Many Requests
Retry-After: 2
RateLimit-Policy: "client";q=30;w=1;pk=:Y2xpZW50LTQy:
RateLimit: "client";r=0;t=2;pk=:Y2xpZW50LTQy:
Content-Type: application/problem+json
Noot

8.2.1 Overzicht statuscodes per HTTP-methode

Onderstaande tabel geeft de meest voorkomende combinaties van HTTP-statuscodes per methode. Een X geeft aan dat de code van toepassing kan zijn; een - betekent dat de combinatie bij voorkeur niet gebruikt wordt.

Code GET HEAD POST PUT PATCH DELETE OPTIONS
200 OK X X X X X X X
201 Created - - X X - - -
202 Accepted - - X - - - -
204 No Content - - - X X X -
301 Moved Permanently X X - X X X X
303 See Other X X X X X X X
304 Not Modified X X - - - - -
307 Temporary Redirect X X X X X X X
400 Bad Request X X X X X X X
401 Unauthorized X X X X X X X
403 Forbidden X X X X X X X
404 Not Found X X X X X X X
405 Method Not Allowed X X X X X X -
406 Not Acceptable X X X X X X X
409 Conflict - - X X X X -
412 Precondition Failed - - X X X X -
413 Payload Too Large - - X X X - -
415 Unsupported Media Type X X X X X X X
429 Too Many Requests X X X X X X X
500 Internal Server Error X X X X X X X
502 Bad Gateway X X X X X X X
503 Service Unavailable X X X X X X X

8.2.2 2xx Succes

De actie is succesvol ontvangen, begrepen en verwerkt.

Code Beschrijving Methoden
200 OK Standaard succescode wanneer de aanvraag succesvol is verwerkt en er een response body wordt teruggegeven. GET, HEAD, PUT, POST, PATCH, DELETE, OPTIONS
201 Created Een nieuwe resource is succesvol aangemaakt. De response bevat bij voorkeur de Location-header met de URI van de nieuwe resource. POST, PUT (alleen bij creatie)
202 Accepted De aanvraag is geaccepteerd voor asynchrone verwerking. Wordt typisch gebruikt voor langlopende taken. POST
204 No Content De aanvraag is succesvol verwerkt maar er is bewust geen response body. PUT, PATCH, DELETE

8.2.3 3xx Redirection

Verdere actie is vereist om de aanvraag te voltooien.

Code Beschrijving Methoden
301 Moved Permanently De resource is permanent verplaatst naar een nieuwe URI. De nieuwe URI staat in de Location-header. Gebruik geen 301 bij POST-requests: sommige clients zetten een POST na een 301 om naar een GET ([RFC9110] §15.4.2). Alle behalve POST
303 See Other Verwijst de client naar een andere URI via een GET-request. Bruikbaar na langlopende acties. Alle
304 Not Modified Bij conditional requests ([RFC9110] §13): de resource is niet gewijzigd sinds het laatste verzoek. Bespaart bandbreedte. GET, HEAD
307 Temporary Redirect Tijdelijke doorverwijzing naar een andere URI. De client MOET de oorspronkelijke methode behouden. Alle

8.2.4 4xx Client Error

De aanvraag bevat een fout aan clientzijde.

Voor foutcodes (4xx en 5xx) MOET de response body het Problem JSON-formaat gebruiken conform [RFC9457]. Zie de sectie REST Foutenafhandeling voor gestandaardiseerde fouttypes en voorbeelden.

Code Beschrijving Methoden
400 Bad Request De aanvraag is ongeldig (syntactisch of semantisch). Generieke clientfout wanneer geen specifiekere 4xx-code van toepassing is. Alle
401 Unauthorized Authenticatie is vereist of het meegegeven token is ongeldig. Alle
403 Forbidden De client is geauthenticeerd maar heeft onvoldoende rechten om de gevraagde actie uit te voeren. Alle
404 Not Found De gevraagde resource bestaat niet. Geef bij collecties een lege lijst (200) terug in plaats van een 404. Alle
405 Method Not Allowed De gebruikte HTTP-methode wordt niet ondersteund voor deze resource. De response MOET een Allow-header bevatten met toegestane methoden. Alle behalve OPTIONS
406 Not Acceptable Het gevraagde mediatype (via Accept-header) kan niet geleverd worden. Alle
409 Conflict De aanvraag is in conflict met de huidige state van de resource. Bijvoorbeeld bij concurrerende updates of het verwijderen van een niet-lege collectie. POST, PUT, PATCH, DELETE
412 Precondition Failed Een conditionele header (If-Match, If-Unmodified-Since) is niet voldaan. Alleen te gebruiken voor HTTP-condities, niet voor businessvalidatie. POST, PUT, PATCH, DELETE
413 Payload Too Large De request body is groter dan de server accepteert. POST, PUT, PATCH
415 Unsupported Media Type Het mediatype van de request body (via Content-Type) wordt niet ondersteund. Alle
429 Too Many Requests De client heeft de toegestane request rate overschreden. De response bevat bij voorkeur een Retry-After-header. Alle

8.2.5 5xx Server Error

De server kon een geldige aanvraag niet verwerken.

Code Beschrijving Methoden
500 Internal Server Error Generieke serverfout bij onverwachte problemen. De client mag dezelfde aanvraag opnieuw proberen. Alle
502 Bad Gateway De server heeft als gateway of proxy een ongeldige response ontvangen van een upstream-service. Alle
503 Service Unavailable De service is tijdelijk onbeschikbaar (overbelasting of gepland onderhoud). De response bevat bij voorkeur een Retry-After-header. Alle

9. REST Foutenafhandeling

9.1 Problem Details JSON

Bij fouten moet de API een correcte HTTP-responscode teruggeven, samen met een payload die voldoet aan [RFC9457], en die het probleem beschrijft.

Zorg voor duidelijke en informatieve foutmeldingen. Zo kan Digitaal Vlaanderen ook de afnemers duidelijk informeren.

Voorbeeld van de structuur voor een foutboodschap:

De error-id in de instance-waarde kan in de meeste gevallen de X-Correlation-Id zijn. De uiteindelijke instance-waarde wordt dan bijvoorbeeld urn:be.vlaanderen.vdip:onderneming:5cd3f329-fe33-4705-8115-e22638eb0f4f. Een supportmedewerker kan hieruit snel afleiden dat het over de Onderneming dienst gaat bij VDIP met referentie 5cd3f329-fe33-4705-8115-e22638eb0f4f.

Ondersteun Problem JSON voor foutresponses /error/problem-json

Voor foutresponses MOET het standaardformaat application/problem+json, conform [RFC9457] gebruikt worden.

Voorzie dit formaat voor zowel clientfouten (4xx) als serverfouten (5xx), zodat clients consistente en machineleesbare foutinformatie krijgen.

Gebruik minimaal deze velden in de response:

  • type: stabiele identifier van het probleemtype (bv. https://data.vlaanderen.be/id/Uitzondering/onderneming/40001)
  • title: korte, menselijk leesbare samenvatting
  • detail: concrete foutuitleg voor deze specifieke situatie
  • instance: identifier van de specifieke foutinstantie (optioneel maar aanbevolen)

Foutresponses MOETEN expliciet gedocumenteerd worden in OpenAPI met application/problem+json als content-type. Gebruik hiervoor het standaard Problem-schema: https://vdip.pages.vlaamseoverheid.ghe.com/specifications/rest/models/problem-1.0.0.yaml#/Problem

NOTE: Clients moeten robuust blijven: infrastructuurcomponenten of uitzonderlijke foutpaden kunnen in sommige gevallen toch geen Problem JSON teruggeven.

NOTE: Clients MOGEN NIET het title of detail velden parsen voor logica op toe te passen, andere properties zijn beter geschikt voor machineverwerking.

Geen stacktraces blootstellen /error/geen-stacktraces

In productieomgevingen mogen er geen stacktraces worden blootgesteld in foutresponses.

Stacktraces bevatten implementatiedetails die geen deel uitmaken van een API en waarop clients nooit mogen vertrouwen. Bovendien kunnen stacktraces gevoelige informatie lekken die partners en derden niet mogen ontvangen, en kunnen ze aanvallers inzicht geven in mogelijke kwetsbaarheden.

9.2 Gestandaardiseerde fouttypes

9.2.1 HTTP 400 - Bad Request

Context De aanvraag heeft ongeldige parameters en/of de validatie van de aanvraag is gefaald. Validatie-errors zijn het gevolg van een businessevaluatie van de payload meegegeven in een voorafgaande API-interactie. Validatie-errors kunnen het verzetten van interactie met (onderdelen van) de API verhinderen.

Validatie-errors worden meegegeven als een lijst, met de naam errors. De elementen van die lijst volgen de basisstructuur van de standaarderrors: type, title en detail zijn verplicht in dit geval. Eigen uitbreidingen zijn toegestaan.

De client moet de request niet herhalen als er geen wijzigingen zijn.

Referentie https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400

9.2.2 HTTP 401 - Unauthorized

Context

Het authenticatietoken van de gebruiker/client is ongeldig voor deze resource.

Als de gebruiker/client geen toegang heeft door onvoldoende toestemming moet een 403 Forbidden-fout worden teruggegeven.

Referentie https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401

9.2.3 HTTP 403 - Forbidden

Context

De gebruiker/client is correct geauthenticeerd maar heeft geen toegang tot de resource.

Als het token ongeldig is - bijv. omdat het vervallen is - moet een 401 Unauthorized-fout worden teruggegeven.

Referentie https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403

9.2.4 HTTP 404 - Not Found

Context

De resource bestaat niet (voor deze gebruiker). Afhankelijk van de businessrules kan een 404-fout teruggeven worden als er geen data beschikbaar is voor een gebruiker.

Geef een lege collectie terug ipv een 404-fout bij het opvragen van collecties. Bij het ophalen van een specifiek - niet bestaand - item kan een 404-fout wel een geldig antwoord zijn.

Referentie https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404

9.2.5 HTTP 500 - Internal Server Error

Context

Foutcode bij onverwachte fouten in de service die niet worden opgevangen door andere foutcodes.

Als er bij runtime exceptions geen betere fout past, kan deze foutcode gebruikt worden als een ‘last resort’.

Referentie https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500

10. REST Beveiliging

Standaard verwachten we een Bearer-token in de Authorization header volgens de [RFC6750] specificatie.

De structuur van de header: Authorization: Bearer <token>

Beveilig endpoints /security/beveilig-endpoints

Alle REST API endpoints MOETEN beveiligd zijn, hiervoor MOET OAuth 2.0 gebruikt worden. De API specificatie MOET de vereiste OAuth scopes duidelijk vermelden OpenAPI specificatie (zie /docs/api-metadata regel).

Definieer en wijs permissies (scopes) toe /security/definieer-scopes

Ieder endpoint van een API MOET beveiligd zijn met de correcte permissies. Voor de namen van de permissies (scopes) wordt er sterk verwacht dat deze de conventie volgen zoals bepaald in deze guide. (bestaande APIs hoeven niet te worden gewijzigd)

De API specificatie MOET de vereiste OAuth scopes duidelijk en volledig vermelden onder #/paths/{path}/{operation}/security/{scheme}/scopes

Volg de naam conventie voor permissies (scopes) /security/scope-naam-conventie

Iedere permissie (scope) die binnen ACM OAuth wordt toegewezen MOET de volgende conventie te volgen. Permissie namen zijn steeds in kleine letters, zonder spaties, en worden gescheiden door underscores.

Conventie:

dv_vdip_resource[_subresource][_toegangsniveau]

Minimaal verplicht:

Optioneel:

CRUD

Role-based

Gebruik Authorization header /security/authorization-header

De Authorization-header wordt gebruikt om API’s te beveiligen, de API-services MOETEN de standaard Bearer token gebruiken zoals gespecificeerd in [RFC6750].

Er worden geen authorisatiegegevens verstuurd via een query parameter: URLs kunnen gecachet worden in de browser en/of gelogd worden. Op deze manier kunnen credentials lekken.

Voorbeeld:

Authorization: Bearer XyZAbCd1234

10.1 ACM OAuth

Enkel ACM OAuth tokens worden geaccepteerd /security/acm-oauth-tokens

Enkel ACM OAuth tokens worden geaccepteerd voor authenticatie en autorisatie van API-aanroepen.

Andere vormen van authenticatie, zoals Basic Authentication of API keys, worden niet geaccepteerd.

Opmerking: In uitzonderlijke gevallen kan het nodig zijn dat OAuth tokens van andere IdPs worden geaccepteerd (bv BOSA of eHealth). "Comply-or-Explain:" met uitgebreide motivatie en gedegen security review is vereist in deze gevallen, gezien dit een afwijking is in de veiligheidsketting binnen Digitaal Vlaanderen is.

11. REST Data formaten

Datum formaat in ISO8601 /data-format/datum-iso8601

Tijdstippen die deel uitmaken van een respons MOETEN in ISO8601 formaat en genormaliseerd worden teruggegeven als UTC met tijdzone-informatie.

We accepteren en geven enkel tijden in UTC terug ('Z' als tijdzone-indicatie), uit ervaring hebben we geleerd dat tijdzone-indicaties vaak verkeerd geïnterpreteerd worden (bv DST), wat tot verwarring en fouten kan leiden. Eventuele verdere tijdzone conversies horen client-side te gebeuren, wij geven enkel tijden terug in UTC, en dat is ook de enige tijdzone-indicatie die we accepteren.

De volgende zijn correct:

Formaten zonder tijdszone-indicatie worden NIET geaccepteerd, bv: 2016-01-25T21:34:55

UITZONDERING: datum-tijd formaten in headers die reeds in andere standaarden gedefinieerd zijn, bv Date header in HTTP, mogen het formaat volgen dat in die standaard gedefinieerd is, bv Sun, 06 Nov 1994 08:49:37 GMT volgens [RFC7231].

Landcode in [ISO3166-1] alpha-3 /data-format/landcode-iso3166

Landcodes die deel uitmaken van een respons MOETEN genormaliseerd teruggegeven worden in ISO3166-1 alpha-3 formaat, bv BEL voor België, NLD voor Nederland, DEU voor Duitsland.

Het gebruik van de alpha-3 codes aligneert met wat Europa voorstelt.

Taalcode in [ISO-639-1-2002] /data-format/taalcode-iso639

Taalcodes die deel uitmaken van een respons MOETEN genormaliseerd teruggegeven worden in ISO639-1 formaat, bv nl voor Nederlands, fr voor Frans, de voor Duits.

Valuta in [ISO4217] /data-format/valuta-iso4217

Valutacodes die deel uitmaken van een respons MOETEN genormaliseerd teruggegeven worden in ISO4217 formaat, bv EUR voor Euro, USD voor US Dollar, JPY voor Japanse Yen.

Binaire data wordt geëncodeerd in base64url /data-format/binaire-base64url

Binaire data die deel uitmaakt van een respons MOET geëncodeerd worden in base64url formaat, zoals gedefinieerd in [RFC4648].
Binnen de JSON payload wordt dit weergegeven als een string property van het binary formaat, tenzij er een betere semantische datatype beschikbaar is, bv file of image.

12. REST JSON Payload

JSON als payload /json/json-als-payload

REST APIs gebruiken JSON als payload formaat voor request en response body.

In sommige gevallen kan hier van afgeweken worden voor specifieke use-cases (comply-or-explain), bv bulk upload in CSV.

Design 1 resource voor lezen en schrijven /json/resource-lezen-schrijven

Gebruik bij voorkeur één logisch resourceschema voor zowel read als write, in plaats van aparte modellen zonder noodzaak.

Gebruik OpenAPI-attributen om verschillen expliciet te maken:

Zo blijft de API consistenter voor clients en beperk je modelduplicatie.

Gebruik standaard media-types /json/standaard-media-types

Gebruik geregistreerde standaard media-types in Content-Type en Accept. Voor JSON APIs is application/json de standaard; voor foutresponses gebruik je bij voorkeur application/problem+json ([RFC9457]).

Vermijd custom media-types tenzij er een duidelijke, gedocumenteerde noodzaak is (comply-or-explain).

Non-JSON media types gebruiken specifieke (standaard) formaten /json/non-json-media-types

Wanneer JSON niet geschikt is, gebruik dan een specifiek standaard media type dat overeenkomt met het payload-formaat, bijvoorbeeld:

Documenteer per operatie expliciet welke request- en response-media-types ondersteund worden.

Retourneer altijd een JSON object als top-level data structuur /json/top-level-object

Er MOET altijd een JSON object {...} als top-level datastructuur in de responses gebruikt worden. Retourneer geen top-level arrays of primitieve types.

Gebruik een enveloppe-object met semantische velden, bijvoorbeeld:

Gebruik lowerCamelCase voor JSON property namen /json/camelcase-property-names

JSON property namen in request- en response-body's MOETEN lowerCamelCase gebruiken.

Dit is de gangbare conventie in JSON/JavaScript-ecosystemen en bevordert compatibiliteit met code-generatietools.

13. REST Collecties

Collecties en Paginering wordt eerst verder besproken in de Github Discussie: https://vlaamseoverheid.ghe.com/DV-Data-Platform/vdip/discussions/2

14. Annex A: Voorbeeld

Voorbeeld van een API die voldoet aan de richtlijnen in deze specificatie vind je terug hier: onderneming-v1.2.3.yaml

A. Index

A.1 Termen gedefinieerd door deze specificatie

A.2 Termen gedefinieerd door verwijzing

B. Referenties

B.1 Normatieve referenties

[ISO-639-1-2002]
Codes for the representation of names of languages -- Part 1: Alpha-2 code. ISO/TC 37/SC 2. ISO. 2002. International Standard. URL: https://www.iso.org/standard/22109.html
[ISO3166-1]
Codes for the representation of names of countries and their subdivisions — Part 1: Country code. International Organization for Standardization (ISO). August 2020. Published. URL: https://www.iso.org/standard/72482.html
[ISO4217]
Currency codes - ISO 4217. ISO. 2015. International Standard. URL: http://www.iso.org/iso/home/standards/currency_codes.htm
[RFC1122]
Requirements for Internet Hosts - Communication Layers. R. Braden, Ed. IETF. October 1989. Internet Standard. URL: https://www.rfc-editor.org/info/rfc1122/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/info/rfc2119/
[RFC2616]
Hypertext Transfer Protocol -- HTTP/1.1. R. Fielding; J. Gettys; J. Mogul; H. Frystyk; L. Masinter; P. Leach; T. Berners-Lee. IETF. June 1999. Draft Standard. URL: https://www.rfc-editor.org/info/rfc2616/
[RFC3986]
Uniform Resource Identifier (URI): Generic Syntax. T. Berners-Lee; R. Fielding; L. Masinter. IETF. January 2005. Internet Standard. URL: https://www.rfc-editor.org/info/rfc3986/
[RFC4229]
HTTP Header Field Registrations. M. Nottingham; J. Mogul. IETF. December 2005. Informational. URL: https://www.rfc-editor.org/info/rfc4229/
[RFC4648]
The Base16, Base32, and Base64 Data Encodings. S. Josefsson. IETF. October 2006. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc4648/
[RFC6570]
URI Template. J. Gregorio; R. Fielding; M. Hadley; M. Nottingham; D. Orchard. IETF. March 2012. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc6570/
[RFC6585]
Additional HTTP Status Codes. M. Nottingham; R. Fielding. IETF. April 2012. Proposed Standard. URL: https://httpwg.org/specs/rfc6585.html
[RFC6750]
The OAuth 2.0 Authorization Framework: Bearer Token Usage. M. Jones; D. Hardt. IETF. October 2012. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc6750/
[RFC7231]
Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content. R. Fielding, Ed.; J. Reschke, Ed. IETF. June 2014. Proposed Standard. URL: https://httpwg.org/specs/rfc7231.html
[RFC7396]
JSON Merge Patch. P. Hoffman; J. Snell. IETF. October 2014. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc7396/
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/info/rfc8174/
[RFC9110]
HTTP Semantics. R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed. IETF. June 2022. Internet Standard. URL: https://httpwg.org/specs/rfc9110.html
[RFC9457]
Problem Details for HTTP APIs. M. Nottingham; E. Wilde; S. Dalal. IETF. July 2023. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc9457/
VDIP Standaard - Werkversie