{"id":26320,"date":"2025-07-01T11:52:00","date_gmt":"2025-07-01T09:52:00","guid":{"rendered":"https:\/\/alistar.net\/?p=26320"},"modified":"2026-10-02T10:25:23","modified_gmt":"2026-10-02T08:25:23","slug":"heres-how-to-set-up-a-rest-api-for-your-data-warehouse","status":"publish","type":"post","link":"https:\/\/alistar.net\/en\/blog\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\/","title":{"rendered":"How to Set Up a REST API for Your Data Warehouse"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Data wordt waardevoller naarmate je er meer mee kunt doen. Wil je het potentieel van jouw data warehouse vergroten, dan helpt het als andere systemen op een eenvoudige manier toegang kunnen krijgen tot die data. Veel moderne systemen beschikken over een REST-client waarmee gegevens via het HTTP-protocol opgevraagd kunnen worden. Door jouw data warehouse via een REST API beschikbaar te stellen, wordt het in \u00e9\u00e9n klap breder inzetbaar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In dit artikel leer je hoe je relatief eenvoudig een REST API toevoegt aan een bestaand data warehouse. Het artikel is gericht op technisch onderlegde lezers. Hoewel het onderwerp niet direct over BI-visualisaties of analyses gaat, draagt het w\u00e9l bij aan de waarde en bruikbaarheid van de BI-omgeving binnen jouw organisatie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Scenario<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">BI-landschappen verschillen sterk per organisatie en maken gebruik van uiteenlopende technologie\u00ebn. Om het artikel concreet en praktisch te houden, kiezen we voor een eenvoudig scenario dat vaak voorkomt. De nadruk ligt op de API zelf, maar de principes zijn breed toepasbaar, ook op omgevingen met cloud databases, Linux-servers of managed hosting voor webapplicaties. Kom je er binnen jouw eigen landschap niet uit, neem dan gerust contact met ons op.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Het voorbeeldlandschap<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">We werken met het volgende uitgangspunt:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83d\udcbb&nbsp;<strong>Platform<\/strong>: Microsoft SQL Server op een Windows-machine<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83d\udd10&nbsp;<strong>Netwerk<\/strong>: De machine bevindt zich in een intern netwerk zonder directe toegang vanaf het internet<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83d\uddc3\ufe0f&nbsp;<strong>Data warehouse<\/strong>: Bevat feit- en dimensietabellen met bedrijfsdata<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83c\udfaf&nbsp;<strong>Doelsysteem<\/strong>: Een klantportaal dat specifieke gegevens nodig heeft<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83d\udd27&nbsp;<strong>API-doel<\/strong>: Alleen toegang bieden tot relevante data voor dit klantportaal<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83d\udd10&nbsp;<strong>Voordeel<\/strong>: Fijnmazige autorisatie en heldere scheiding tussen technische en functionele logica<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In plaats van \u00e9\u00e9n generieke API voor het hele data warehouse, bouwen we dus een gerichte API voor een specifieke toepassing.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-7387b849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h2 class=\"wp-block-heading\">\u2699\ufe0fVoorbereiding<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">De te implementeren API levert JSON documenten over HTTP op basis van GET requests. We gebruiken hiervoor het&nbsp;<a href=\"https:\/\/fastapi.tiangolo.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">open source framework FastAPI<\/a>&nbsp;omdat het &#8211; in de woorden van de makers &#8211;&nbsp;<em>high performance, easy to learn, fast to code, ready for production&nbsp;<\/em>is. FastAPI is een Python framework. Omdat het lichtgewicht is, kan het doorgaans prima op dezelfde machine als het data warehouse ge-host worden. Mocht het gebruik van de API in productie toch teveel resources vragen, dan is hij eenvoudig naar een andere machine verplaatsbaar.<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-7387b849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h3 class=\"wp-block-heading\">1. Installeer Python<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Download de meest recente versie van Python vanaf:<br>\ud83d\udc49&nbsp;<a class=\"\" href=\"https:\/\/www.python.org\/downloads\/\"><\/a><a href=\"https:\/\/www.python.org\/downloads\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.python.org\/downloads\/<\/a><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.python.org\/downloads\/\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>Gebruik&nbsp;<strong>niet<\/strong>&nbsp;de versie uit de Microsoft Store. Deze veroorzaakt vaak problemen bij package-installaties.<\/p>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Tijdens de installatie:<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 Vink aan:&nbsp;<strong>Add Python to PATH<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udce6 Kies bij voorkeur een versie vanaf&nbsp;<strong>Python 3.10<\/strong>&nbsp;of hoger. Dit artikel gebruikt&nbsp;<strong>Python 3.13<\/strong>.<\/p>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">2. Maak een virtuele omgeving<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Het is goed gebruik om Python-oplossingen altijd in hun eigen ge\u00efsoleerde virtuele omgeving te plaatsen. Dit maakt package magement eenvoudig en zorgt ervoor dat de oplossing later verplaatsbaar is naar een andere machine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voor de bestanden van de API en de virtuele Python-omgeving maak je een directory op een goede plek, bijvoorbeeld&nbsp;<code>C:\\DWH_API_Klantportaal<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open een PowerShell-venster en navigeer naar die directory. Maak hier een virtuele python omgeving.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PS C:\\DWH_API_Klantportaal> python -m venv .venv<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Activeer vervolgens deze omgeving.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PS C:\\DWH_API_Klantportaal> .\\.venv\\Scripts\\Activate.ps1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Je ziet nu&nbsp;<code>(.venv)<\/code>&nbsp;voor je prompt verschijnen. Dit betekent dat je ge\u00efsoleerde Python-omgeving actief is.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Installeer de benodigde pakketten<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Installeer FastAPI en de overige libraries die je nodig hebt om een API te draaien en verbinding te maken met SQL Server:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(.venv) PS C:\\DWH_API_Klantportaal> pip install fastapi uvicorn pyodbc starlette<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Deze bibliotheken zijn:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Pakket<\/th><th>Functie<\/th><\/tr><\/thead><tbody><tr><td><code>fastapi<\/code><\/td><td>Webframework voor het bouwen van de API<\/td><\/tr><tr><td><code>uvicorn<\/code><\/td><td>ASGI-server om de API uit te voeren<\/td><\/tr><tr><td><code>pyodbc<\/code><\/td><td>Verbindingslaag met SQL Server via ODBC<\/td><\/tr><tr><td><code>starlette<\/code><\/td><td>Onderliggende middleware voor FastAPI<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Je Python-omgeving is nu klaar voor gebruik!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\ude80Jouw eerste API-endpoint<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nu je Python-omgeving klaar is, kun je beginnen met het schrijven van je eerste API. FastAPI definieer je in een Python-bestand. Dit bestand bewerk je het liefst in een geschikte editor zoals&nbsp;<strong>Visual Studio Code (VS Code)<\/strong>, zodat je gebruik kunt maken van handige functies zoals syntax highlighting, autocompletion en debugging.&nbsp;<a href=\"https:\/\/code.visualstudio.com\/download\" target=\"_blank\" rel=\"noreferrer noopener\">VS Code kun je hier downloaden<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Open VS Code<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Als je&nbsp;<code>code<\/code>&nbsp;als commandoregelprogramma beschikbaar hebt (via je&nbsp;<code>%PATH%<\/code>), kun je de editor starten vanuit de terminal:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(.venv) PS C:\\DWH_API_Klantportaal> code . -g main.py<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Hiermee open je de map in VS Code \u00e9n wordt een nieuw bestand&nbsp;<code>main.py<\/code>&nbsp;aangemaakt.<\/li>\n\n\n\n<li>Werkt dit niet? Start dan VS Code via Start &gt; Visual Studio Code, open handmatig de juiste map, en maak zelf een bestand aan met de naam&nbsp;<code>main.py<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2. Plak het volgende script in&nbsp;<code>main.py<\/code><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>import pyodbc, os\nfrom fastapi import FastAPI, HTTPException, Query\nfrom typing import Optional, List, Dict, Any\n\napp = FastAPI()\n\n# Pas deze verbindingsstring aan jouw situatie aan:\nconn_str = (\n    \"DRIVER={ODBC Driver 17 for SQL Server};\"\n    \"SERVER=localhost;\"\n    \"DATABASE=WideWorldImportersDW;\"\n    \"Trusted_Connection=yes;\"\n)\n<br>@app.get(\"\/items\")\ndef get_items():\n    conn = pyodbc.connect( conn_str )\n    cursor = conn.cursor()\n    cursor.execute(\"SELECT ItemID, Name FROM &#91;dwh].&#91;Item]\")\n    rows = cursor.fetchall()\n    return &#91; {\"id\": r.ItemID, \"name\": r.Name } for r in rows ]<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd0d Wat doet dit script?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Definieert een&nbsp;<code>GET<\/code>-endpoint op&nbsp;<code>\/items<\/code><\/li>\n\n\n\n<li>Maakt verbinding met SQL Server via ODBC<\/li>\n\n\n\n<li>Voert een eenvoudige&nbsp;<code>SELECT<\/code>&nbsp;uit op de tabel&nbsp;<code>[dwh].[Item]<\/code><\/li>\n\n\n\n<li>Geeft de resultaten terug als een JSON-lijst van objecten met&nbsp;<code>id<\/code>&nbsp;en&nbsp;<code>name<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3 .Start de API<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ga terug naar je terminal en start de API met:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(.venv) PS C:\\DWH_API_Klantportaal> uvicorn main:app --reload --host 0.0.0.0 --port 8000<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udccc Wat betekent dit?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>main:app<\/code>&nbsp;verwijst naar de&nbsp;<code>app<\/code>&nbsp;variabele in&nbsp;<code>main.py<\/code><\/li>\n\n\n\n<li><code>--reload<\/code>&nbsp;zorgt dat wijzigingen automatisch worden doorgevoerd (handig tijdens ontwikkeling)<\/li>\n\n\n\n<li><code>--host 0.0.0.0<\/code>&nbsp;maakt de API bereikbaar vanaf andere apparaten in het netwerk<\/li>\n\n\n\n<li><code>--port 8000<\/code>&nbsp;stelt de poort in waarop de API bereikbaar is<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Je zou nu deze melding moeten zien:.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INFO: Uvicorn running on <a href=\"http:\/\/0.0.0.0\/\">http:\/\/0.0.0.0<\/a>:8000 (Press CTRL+C to quit)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4. Test het endpoint<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Open een browser en ga naar:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;localhost:8000\/items\u00a0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Als alles goed is gegaan, zie je een JSON-resultaat zoals dit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;<br> {<br> \"id\": 0,<br> \"name\": \"Unknown\"<br> },<br> {<br> \"id\": 1,<br> \"name\": \"Void fill 400 L bag (White) 400L\"<br> },<br> {<br> \"id\": 2,<br> \"name\": \"Void fill 300 L bag (White) 300L\"<br> },<br> etc ...<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Gefeliciteerd, je eerste API-endpoint werkt! \ud83c\udf89<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udee0\ufe0f&nbsp;<strong>Opmerking:<\/strong>&nbsp;Zorg ervoor dat de SQL-gebruiker waarmee je de API uitvoert toegang heeft tot de gebruikte tabel, en dat de juiste ODBC-driver is ge\u00efnstalleerd (bijv. versie 17 of 18 van Microsoft).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddf1 Een onderhoudbare API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Het eerste&nbsp;<code>\/items<\/code>-endpoint is een goede start maar naarmate je meer endpoints toevoegt of grotere datavolumes verwerkt, is het slim om je code beter te structureren. Zo wordt onderhoud eenvoudiger en kun je logica hergebruiken.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2728 Wat verbeteren we?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 We verplaatsen de querylogica naar aparte functies<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 We voegen foutafhandeling toe<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 We implementeren&nbsp;<strong>paginering<\/strong>&nbsp;voor grotere datasets (bijv.&nbsp;<code>\/orders<\/code>)<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 We geven bij bulkresultaten ook het&nbsp;<strong>totaal aantal rijen<\/strong>&nbsp;terug<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd27 Stap 1: Herbruikbare functies<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Voeg bovenin je&nbsp;<code>main.py<\/code>&nbsp;de volgende functies toe, boven de endpoint-definities:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def query_sql(sql: str):\n    try:\n        with pyodbc.connect(conn_str) as conn:\n            with conn.cursor() as cursor:\n                cursor.execute(sql)\n                columns = &#91;column&#91;0] for column in cursor.description]\n                results = &#91;dict(zip(columns, row)) for row in cursor.fetchall()]\n                return results\n    except Exception as e:\n        raise HTTPException(status_code=500, detail=str(e))\n\ndef get_total_count( table: str ) -&gt; int:\n    try:\n        with pyodbc.connect(conn_str) as conn:\n            with conn.cursor() as cursor:\n                cursor.execute(f\"SELECT COUNT(*) FROM {table}\")\n                return cursor.fetchone()&#91;0]\n    except Exception as e:\n        raise HTTPException( status_code = 500, detail = str(e) )<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Deze functies:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Maken verbinding met SQL Server<\/li>\n\n\n\n<li>Voeren de query uit<\/li>\n\n\n\n<li>Mappen de resultaten naar een lijst van dictionaries (JSON-compatibel)<\/li>\n\n\n\n<li>Vangen fouten netjes af en geven een&nbsp;<code>HTTP 500<\/code>&nbsp;terug<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\udde9 Stap 2: Items-endpoint herschrijven<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Gebruik de nieuwe functie in een compactere, schonere versie van&nbsp;<code>\/items<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@app.get( \"\/items\", response_model = List&#91;Dict] )\ndef get_items():\n    sql = \"SELECT * FROM dwh.Item\"\n    return query_sql( sql )<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcc4 Stap 3: Orders met paginering<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Voor grotere datasets is paginering essentieel. Zo voorkom je dat clients duizenden rijen tegelijk moeten verwerken. Voeg dit endpoint toe:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@app.get( \"\/orders\", response_model = Dict )\ndef get_orders( skip: int = Query( 0, ge = 0 ), limit: int = Query( 100, ge = 1, le = 1000 ) ):\n    total = get_total_count(\"dwh.Orders\")\n    sql = f\"\"\"\n        SELECT * FROM dwh.Orders\n        ORDER BY &#91;Order Date Key] DESC\n        OFFSET {skip} ROWS\n        FETCH NEXT {limit} ROWS ONLY\n    \"\"\"\n    items = query_sql( sql )\n    return {\n        \"total\": total,\n        \"skip\": skip,\n        \"limit\": limit,\n        \"items\": items\n    }<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Met dit endpoint:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Haal je maximaal 1000 orders tegelijk op<\/li>\n\n\n\n<li>Geef je via&nbsp;<code>skip<\/code>&nbsp;en&nbsp;<code>limit<\/code>&nbsp;aan welk \u201cpagina\u201d-deel je opvraagt<\/li>\n\n\n\n<li>Geef je naast de resultaten ook het&nbsp;<strong>totaal aantal beschikbare rijen<\/strong>&nbsp;terug<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Voorbeeld:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;localhost:8000\/orders?limit=1000&amp;skip=3000<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcdd Best practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zet complexe filtering of businesslogica liever in SQL views dan in Python-code. Zo blijft de API generiek en de logica beheersbaar in het data warehouse.<\/li>\n\n\n\n<li>Maak endpoints eenvoudig en voorspelbaar \u2014 met duidelijke parameters, consistente namen en logische responsstructuren.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd0eFiltering<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Een veelvoorkomende functionele eis is dat een applicatie alleen data wil zien die voor haar relevant is. In dit geval: een klantportaal dat alleen de orders van \u00e9\u00e9n specifieke klant mag opvragen. Hiervoor voeg je een nieuw endpoint toe met een&nbsp;<strong>path parameter<\/strong>&nbsp;in plaats van een query parameter.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udce5 Endpoint: orders per klant<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Voeg het volgende toe aan&nbsp;<code>main.py<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@app.get( \"\/customer\/{customer_id}\/orders\", response_model = List&#91;Dict] )\ndef get_orders_by_customer( customer_id: int ):\n    sql = f\"SELECT * FROM dwh.Orders WHERE &#91;Customer Key] = {customer_id}\"\n    return query_sql( sql )<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>customer_id<\/code>&nbsp;is hier onderdeel van de URL zelf (een zogeheten&nbsp;<strong>path parameter<\/strong>).<\/li>\n\n\n\n<li>Deze waarde wordt direct gebruikt in de SQL-query.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Voorbeeld:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;localhost:8000\/customer\/50\/orders.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u2026haalt alle orders op voor klant met ID 50.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u26a0\ufe0f Veiligheidstip<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Het gebruik van&nbsp;<code>f\"SELECT ... {value}\"<\/code>&nbsp;is&nbsp;<strong>vatbaar voor SQL-injectie<\/strong>&nbsp;als je geen controle hebt over de input. Voor extra veiligheid (zeker bij tekstvelden), gebruik je parameterbinding met&nbsp;<code>?<\/code><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Pas je functie&nbsp;<code>query_sql<\/code>&nbsp;aan zodat die&nbsp;<strong>optioneel parameters accepteert<\/strong>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>from typing import Optional, List, Any\n\ndef query_sql(sql: str, params: Optional&#91;List&#91;Any]] = None):\n    try:\n        with pyodbc.connect(conn_str) as conn:\n            with conn.cursor() as cursor:\n                if params:\n                    cursor.execute(sql, params)\n                else:\n                    cursor.execute(sql)\n                columns = &#91;column&#91;0] for column in cursor.description]\n                results = &#91;dict(zip(columns, row)) for row in cursor.fetchall()]\n                return results\n    except Exception as e:\n        raise HTTPException(status_code=500, detail=str(e))\n<\/code><\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>In je endpoint stuur je nu de SQL met&nbsp;<strong>placeholders (<code>?<\/code>)<\/strong>&nbsp;mee, en een lijst met parameters:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>@app.get(\"\/customer\/{customer_id}\/orders\", response_model=List&#91;Dict])\ndef get_orders_by_customer(customer_id: int):\n    sql = \"SELECT * FROM dwh.Orders WHERE &#91;Customer Key] = ?\"\n    return query_sql(sql, &#91;customer_id])<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Waarom werkt dit?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PyODBC (net als de meeste database-API\u2019s in Python) ondersteunt parameter binding via&nbsp;<code>?<\/code>&nbsp;placeholders in de SQL-string.<\/li>\n\n\n\n<li>Parameters worden los van de query verstuurd, waardoor SQL-injectie onmogelijk is.<\/li>\n\n\n\n<li>Door de generieke functie aan te passen met een optionele&nbsp;<code>params<\/code>&nbsp;parameter, kun je voor eenvoudige queries zonder parameters nog steeds dezelfde functie gebruiken.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\uddfc Extra filtering: alleen open orders<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Stel dat je all\u00e9\u00e9n openstaande orders wilt ophalen. Dan kun je een tweede gefilterd endpoint maken:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@app.get(\"\/customer\/{customer_id}\/open_orders\", response_model=List&#91;Dict])\ndef get_open_orders_by_customer(customer_id: int):\n    sql = f\"\"\"\n        SELECT * FROM dwh.Orders\n        WHERE &#91;Customer Key] = {customer_id} AND &#91;Order Status] = 'open'\n    \"\"\"\n    return query_sql(sql)\n<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<h3 class=\"wp-block-heading\">\ud83c\udfaf\u00a0Best practice<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Definieer een view in het data warehouse met alleen de open orders per klant, en roep die aan vanuit de API. Zo blijft alle logica op \u00e9\u00e9n centrale plek beheerd.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcdd Let op datatype van klantnummers&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">De voorbeelden hierboven gaan ervan uit dat het klantnummer een&nbsp;<code>int<\/code>&nbsp;is. In jouw eigen data warehouse kan dat ook een&nbsp;<code>varchar<\/code>,&nbsp;<code>guid<\/code>, of iets anders zijn. Pas dan de type-aanduiding&nbsp;<code>customer_id: int<\/code>&nbsp;aan naar het juiste type, bijvoorbeeld&nbsp;<code>str<\/code>.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">\u2699\ufe0fEndpoints genereren<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Als je data warehouse veel tabellen bevat en je wilt niet handmatig voor elke tabel een endpoint schrijven, kun je dit proces automatiseren. Met een slimme SQL-query op de system catalogus van SQL Server genereer je Python-code die je direct in je API kunt plakken.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83c\udfaf Doel<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Snel API-endpoints maken voor&nbsp;<strong>alle tabellen<\/strong>&nbsp;in bepaalde schema&#8217;s (bijvoorbeeld&nbsp;<code>Fact<\/code>&nbsp;en&nbsp;<code>Dimension<\/code>)<\/li>\n\n\n\n<li>Ondersteuning voor endpoints die zoeken op&nbsp;<strong>primary key<\/strong>&nbsp;(detail-endpoints)<\/li>\n\n\n\n<li>Endpoints met paginering voor bulkdata<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83d\udccb Query 1: Endpoints per primary key<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Deze query genereert een FastAPI endpoint per tabel, dat een record ophaalt op basis van de primaire sleutel (uitgaande van \u00e9\u00e9n kolom als primary key).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT <a href=\"mailto:'@app.get\">'@app.get<\/a>( \"\/' + REPLACE( KCU.TABLE_NAME, ' ', '' ) + '\/{' + REPLACE( KCU.TABLE_NAME, ' ', '' ) + '_id}\", response_model = List&#91;Dict] )\ndef get_' + REPLACE( KCU.TABLE_NAME, ' ', '' ) + '_by_id( ' + REPLACE( KCU.TABLE_NAME, ' ', '' ) + '_id: ' + case C.DATA_TYPE WHEN 'int' then 'int' WHEN 'bigint' then 'int' WHEN 'varchar' then 'str' WHEN 'date' then 'str' END + ' ):\n    sql = f\"SELECT * FROM &#91;' + KCU.TABLE_CATALOG + '].&#91;' + KCU.TABLE_SCHEMA + '].&#91;' + KCU.TABLE_NAME + '] WHERE &#91;' + KCU.COLUMN_NAME + '] = {' + REPLACE( KCU.TABLE_NAME, ' ', '' ) + '_id}\"\n    return query_sql( sql )\n\n'\nFROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU\nJOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON KCU.CONSTRAINT_NAME = TC.&#91;CONSTRAINT_NAME] AND KCU.CONSTRAINT_SCHEMA = TC.&#91;CONSTRAINT_SCHEMA] AND TC.&#91;CONSTRAINT_TYPE] = 'PRIMARY KEY'\nJOIN INFORMATION_SCHEMA.COLUMNS C ON KCU.TABLE_CATALOG = C.TABLE_CATALOG AND KCU.TABLE_SCHEMA = C.TABLE_SCHEMA AND KCU.TABLE_NAME = C.TABLE_NAME AND KCU.COLUMN_NAME = C.COLUMN_NAME\nWHERE KCU.TABLE_SCHEMA IN ('Fact','Dimension') AND KCU.ORDINAL_POSITION = 1<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">&nbsp;<\/h4>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83d\udccb Query 2: Bulk endpoints met paginering<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Deze query genereert endpoints die data per tabel pagineren, handig voor tabellen met veel records.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT <a href=\"mailto:'@app.get\">'@app.get<\/a>( \"\/all_' + REPLACE( KCU.TABLE_NAME, ' ', '' ) + '\", response_model = Dict )\ndef get_all_' + REPLACE( KCU.TABLE_NAME, ' ', '' ) + '( skip: int = Query( 0, ge = 0 ), limit: int = Query( 100, ge = 1, le = 1000 ) ):\n    total = get_total_count(\"&#91;' + KCU.TABLE_CATALOG + '].&#91;' + KCU.TABLE_SCHEMA + '].&#91;' + KCU.TABLE_NAME + ']\")\n    sql = f\"\"\"\n        SELECT * FROM &#91;' + KCU.TABLE_CATALOG + '].&#91;' + KCU.TABLE_SCHEMA + '].&#91;' + KCU.TABLE_NAME  + ']\n\t\tORDER BY &#91;' +  KCU.COLUMN_NAME + ']\n        OFFSET {skip} ROWS\n        FETCH NEXT {limit} ROWS ONLY\n    \"\"\"\n    items = query_sql( sql )\n    return { \"total\": total, \"skip\": skip, \"limit\": limit, \"values\": items }\n\n'\nFROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU\nJOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON KCU.CONSTRAINT_NAME = TC.&#91;CONSTRAINT_NAME] AND KCU.CONSTRAINT_SCHEMA = TC.&#91;CONSTRAINT_SCHEMA] AND TC.&#91;CONSTRAINT_TYPE] = 'PRIMARY KEY'\nJOIN INFORMATION_SCHEMA.COLUMNS C ON KCU.TABLE_CATALOG = C.TABLE_CATALOG AND KCU.TABLE_SCHEMA = C.TABLE_SCHEMA AND KCU.TABLE_NAME = C.TABLE_NAME AND KCU.COLUMN_NAME = C.COLUMN_NAME\nWHERE KCU.TABLE_SCHEMA IN ('Fact','Dimension') AND KCU.ORDINAL_POSITION = 1<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u26a0\ufe0f Let op<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Deze queries gaan ervan uit dat alle tabellen een&nbsp;<strong>enkele kolom als primaire sleutel<\/strong>&nbsp;hebben (geen samengestelde keys).<\/li>\n\n\n\n<li>Pas eventueel de schema-namen (<code>Fact<\/code>,&nbsp;<code>Dimension<\/code>) aan naar jouw data warehouse omgeving.<\/li>\n\n\n\n<li>Plak de output van deze queries in je&nbsp;<code>main.py<\/code>&nbsp;onder je bestaande code.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udca1 Tip<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wil je de gegenereerde endpoints combineren met de parameter-gebonden veilige&nbsp;<code>query_sql()<\/code>&nbsp;functie, pas dan de gegenereerde SQL-strings aan met&nbsp;<code>?<\/code>&nbsp;en stuur parameters mee, zoals eerder besproken.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\uddec Goed om te weten: Datatype-conversie tussen SQL en JSON<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wanneer je data uit je SQL-database via FastAPI naar JSON exposeert, vindt er automatisch een conversie plaats van SQL-datatypen naar JSON-compatibele formaten. Dit gebeurt doordat de database driver (zoals&nbsp;<code>pyodbc<\/code>) de SQL-resultaten omzet naar Python-typen, waarna FastAPI deze Python-typen naar JSON serialiseren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">De meest voorkomende SQL-typen zoals integers, strings en booleans worden rechtstreeks vertaald naar respectievelijk JSON-nummers, strings en booleans. Datums en tijden worden automatisch omgezet naar ISO 8601-geformatteerde strings, zodat ze in JSON leesbaar en gestandaardiseerd zijn. Null-waarden in de database verschijnen als&nbsp;<code>null<\/code>&nbsp;in JSON.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voor complexere of speciale datatypes, zoals binaire data of geografische typen, kan het nodig zijn om zelf conversies of validaties te implementeren. Op die manier houd je de controle over hoe data in JSON verschijnt en zorg je voor consistente en correcte API-responses.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>SQL datatype<\/th><th>Python datatype<\/th><th>JSON datatype<\/th><th>Opmerking<\/th><\/tr><\/thead><tbody><tr><td><code>int<\/code>,&nbsp;<code>bigint<\/code><\/td><td><code>int<\/code><\/td><td>Number (integer)<\/td><td>Direct omgezet<\/td><\/tr><tr><td><code>float<\/code>,&nbsp;<code>decimal<\/code><\/td><td><code>float<\/code>&nbsp;\/&nbsp;<code>Decimal<\/code><\/td><td>Number (float)<\/td><td>Decimal wordt meestal float<\/td><\/tr><tr><td><code>varchar<\/code>,&nbsp;<code>text<\/code><\/td><td><code>str<\/code><\/td><td>String<\/td><td>Direct omgezet<\/td><\/tr><tr><td><code>bit<\/code><\/td><td><code>bool<\/code><\/td><td>Boolean<\/td><td>Wordt&nbsp;<code>true<\/code>\/<code>false<\/code><\/td><\/tr><tr><td><code>datetime<\/code>,&nbsp;<code>date<\/code><\/td><td><code>datetime.datetime<\/code>&nbsp;\/&nbsp;<code>datetime.date<\/code><\/td><td>String (ISO 8601)<\/td><td>Wordt ISO 8601 string (bv.&nbsp;<code>\"2025-07-02T10:30:00\"<\/code>)<\/td><\/tr><tr><td><code>time<\/code><\/td><td><code>datetime.time<\/code><\/td><td>String (HH:MM:SS)<\/td><td>Wordt string<\/td><\/tr><tr><td><code>NULL<\/code><\/td><td><code>None<\/code><\/td><td><code>null<\/code><\/td><td>JSON&nbsp;<code>null<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd10Een veilige(re) API met een API-Key<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Zonder beveiliging kan iedereen met netwerktoegang je API gebruiken. Dat is meestal niet wenselijk, ook niet binnen een intern netwerk. Daarom voegen we een eenvoudige, centrale&nbsp;<strong>API-key<\/strong>&nbsp;authenticatie toe.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udee0\ufe0f Voorbereiding: API-key instellen<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Genereer een lange, sterke API-key.<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Bijvoorbeeld via een online generator of via PowerShell:<\/p>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Zet deze API-key als environment variabele<\/strong>&nbsp;op de machine waar de API draait, bijvoorbeeld:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>(.venv) PS C:\\DWH_API_Klantportaal>\u00a0$env:API_KEY = \"jouw-lange-api-key-hier\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bovenstaand commando maakt de variabele beschikbaar in de huidige PowerShell-sessie. Zorg er ook voor dat dit een globale systeemvariabele is zodat hij na een reboot bewaard blijft.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\udde9 Code-aanpassingen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Voeg bovenaan je&nbsp;<code>main.py<\/code>&nbsp;de volgende regels toe:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import os<br><br>API_KEY = os.getenv(\"DWH_API_KEY\")\nif not API_KEY:\n    raise RuntimeError(\"DWH_API_KEY environment variable niet gevonden. Zorg ervoor dat deze is ingesteld.\")<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udea7 Middleware toevoegen voor API-key validatie<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Implementeer een Starlette middleware die elk binnenkomend verzoek controleert op de juiste API-key in de header&nbsp;<code>X-API-Key<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from fastapi.responses import Response\nfrom starlette.middleware.base import BaseHTTPMiddleware\nfrom starlette.requests import Request<br><br>class APIKeyMiddleware( BaseHTTPMiddleware ):\n    async def dispatch( self, request: Request, call_next ):\n        if request.headers.get( \"X-API-Key\" ) != API_KEY:\n            return Response( status_code = 403, content = \"Forbidden\" )\n        return await call_next( request )<br>\napp = FastAPI()\napp.add_middleware( APIKeyMiddleware )\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd11 Gebruik van de API<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Verplicht:<\/strong>&nbsp;Voeg bij elk verzoek de header&nbsp;<code>X-API-Key<\/code>&nbsp;toe met de juiste sleutel.<\/li>\n\n\n\n<li>Voor testen kun je Postman gebruiken of browsers zoals Firefox met devtools, of commandline tools zoals&nbsp;<code>curl<\/code>:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -H\u00a0\"X-API-Key: jouw-lange-api-key-hier\"\u00a0http:\/\/localhost:8000\/items<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u2699\ufe0fNaar productie<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">de API als Windows-service draaien<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Als je API op een Windows-machine draait, wil je dat deze automatisch start bij het opstarten van de server en altijd blijft draaien, ook na crashes of herstarts. Dit regel je het eenvoudigst door de API als een Windows-service te installeren.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udee0\ufe0f Wat heb je nodig?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>nssm<\/strong>&nbsp;(Non-Sucking Service Manager), een handig tooltje om elk script als Windows-service te draaien.<\/li>\n\n\n\n<li>Een dedicated, non-privileged Windows-gebruiker voor de service (voor veiligheid en bestandsrechten).<\/li>\n\n\n\n<li>Toegang tot de map met je Python virtuele omgeving en API code.<\/li>\n\n\n\n<li>De juiste rechten om services te installeren en te beheren (admin rechten).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcdd Voorbeeld: batch-script voor nssm<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Maak een&nbsp;<code>.bat<\/code>-bestand, bijvoorbeeld&nbsp;<code>start_dwh_api.bat<\/code>&nbsp;met deze inhoud:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@echo off\ncd \/d \"C:\\DWH_API_Klantportaal\"\ncall .venv\\Scripts\\activate.bat\npython -m uvicorn main:app --host 0.0.0.0 --port 8000<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd27 Service installeren met nssm<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Download nssm van&nbsp;<a href=\"https:\/\/nssm.cc\/download\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/nssm.cc\/download<\/a><\/li>\n\n\n\n<li>Open een command prompt als administrator<\/li>\n\n\n\n<li>Installeer de service met nssm:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>PS C:\\>\u00a0nssm install DWH_API_Service \"C:\\Path\\to\\start_dwh_api.bat\"<\/code><\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>Configureer de service in nssm (gebruik de GUI of commandline) om te draaien onder de juiste gebruiker en met de juiste werkmap.<\/li>\n\n\n\n<li>Start de service<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>PS C:\\>\u00a0nssm start DWH_API_Service<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd10 Rechten en veiligheid<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Geef de Windows-gebruiker alleen&nbsp;<strong>SELECT-rechten<\/strong>&nbsp;op de benodigde database-views.<\/li>\n\n\n\n<li>Geef deze gebruiker ook&nbsp;<strong>lees- en execute-rechten<\/strong>&nbsp;op de map waar de API en virtuele omgeving staan.<\/li>\n\n\n\n<li>Vermijd het draaien van de service onder een Administrator-account.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83c\udf10 Bereikbaarheid van je API<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Je API draait nu, maar hoe zorg je dat andere systemen \u2018m kunnen bereiken? Dit hangt af van waar je API-host staat en waar de consumerende applicaties draaien.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udda5\ufe0f Lokale toegang<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Als de API draait op een machine binnen hetzelfde (virtuele) netwerk als de consumerende applicatie, dan kun je het IP-adres of de hostnaam van die machine gebruiken in plaats van&nbsp;<code>localhost<\/code>.<\/li>\n\n\n\n<li>Bijvoorbeeld:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;192.168.1.100:8000\/items<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">of<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;api-server-01.yourdomain.local:8000\/items<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83c\udf0d Externe toegang via internet<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Als applicaties de API via internet moeten benaderen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zorg voor een&nbsp;<strong>Fully Qualified Domain Name (FQDN)<\/strong>&nbsp;die verwijst naar het publieke IP-adres van je API-host (of een tussenliggende firewall\/load balancer).<\/li>\n\n\n\n<li>Richt DNS zo in dat de FQDN naar dat IP verwijst.<\/li>\n\n\n\n<li>Zet een&nbsp;<strong>reverse proxy<\/strong>&nbsp;of&nbsp;<strong>load balancer<\/strong>&nbsp;in tussen internet en je API-host, zoals&nbsp;<strong>nginx<\/strong>,&nbsp;<strong>Azure Application Gateway<\/strong>, of&nbsp;<strong>AWS ALB<\/strong>.<\/li>\n\n\n\n<li>Deze tussenlaag regelt vaak ook TLS (https) terminatie en routing.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd12 Beveiliging in netwerklaag<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gebruik altijd&nbsp;<strong>TLS (HTTPS)<\/strong>&nbsp;om verkeer te versleutelen.<\/li>\n\n\n\n<li>Stel je firewall zo in dat alleen verkeer vanaf specifieke IP-adressen of netwerken wordt toegelaten.<\/li>\n\n\n\n<li>Overweeg VPN-toegang voor interne applicaties.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd27 FastAPI configuratie voor HTTPS redirect<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">FastAPI zelf kan geen TLS afhandelen, maar je kunt wel FastAPI instrueren om HTTP-verzoeken automatisch door te sturen naar HTTPS:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from starlette.middleware.httpsredirect import HTTPSRedirectMiddleware\n\napp = FastAPI()\napp.add_middleware( HTTPSRedirectMiddleware )<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Let op: je reverse proxy of load balancer moet TLS afhandelen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83d\udca1 Samenvatting<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Scenario<\/th><th>Toegangsadres voorbeeld<\/th><th>Opmerkingen<\/th><\/tr><\/thead><tbody><tr><td>Zelfde netwerk<\/td><td><code><a href=\"http:\/\/192.168.1.100\/\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/192.168.1.100<\/a>:8000\/items<\/code><\/td><td>Eenvoudig via IP of hostname<\/td><\/tr><tr><td>Publieke internet<\/td><td><code><a href=\"https:\/\/api.jouwbedrijf.nl\/items\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/api.jouwbedrijf.nl\/items<\/a><\/code><\/td><td>Gebruik DNS, reverse proxy, TLS<\/td><\/tr><tr><td>Development (lokaal)<\/td><td><code><a href=\"http:\/\/localhost:8000\/items\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/localhost:8000\/items<\/a><\/code><\/td><td>Alleen lokaal beschikbaar<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcda You&#8217;ve got the docs! \u2014 Automatische API-documentatie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">FastAPI levert van zichzelf een grote bonus mee: automatische, interactieve documentatie. Hiermee kun je jouw API makkelijk verkennen en testen, en het helpt bij het communiceren met andere teams of externe developers.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd0e Wat krijg je erbij?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Swagger UI:<\/strong><br>Een webinterface waar je alle beschikbare endpoints, parameters en responsmodellen kunt bekijken en direct kunt uitproberen.<br>Bezoek het via:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;localhost:8000\/docs<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ReDoc:<\/strong><br>Een alternatieve, meer technische API-documentatie, overzichtelijk en met goede leesbaarheid.<br>Te vinden via:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;localhost:8000\/redoc<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>OpenAPI-spec:<\/strong><br>De complete machine-leesbare API-specificatie in JSON-formaat, waarmee andere tools en systemen jouw API kunnen begrijpen:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;localhost:8000\/openapi.json<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83c\udfaf Waarom is dit handig?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sneller testen en ontwikkelen:<\/strong>&nbsp;zonder zelf documentatie te schrijven of aparte tools te gebruiken.<\/li>\n\n\n\n<li><strong>Communicatie:<\/strong>&nbsp;makkelijk delen met ontwikkelaars, support, of externe partijen.<\/li>\n\n\n\n<li><strong>Automatisering:<\/strong>&nbsp;tooling kan automatisch client libraries genereren op basis van de OpenAPI-specificatie.<\/li>\n\n\n\n<li><strong>Up-to-date:<\/strong>&nbsp;de documentatie is altijd synchroon met je code, omdat die realtime wordt gegenereerd.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udca1 Tips<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gebruik&nbsp;<strong>type hints<\/strong>&nbsp;en&nbsp;<strong>response_model<\/strong>&nbsp;in je endpoints om de documentatie compleet en correct te maken.<\/li>\n\n\n\n<li>Voeg waar nodig beschrijvingen toe met FastAPI\u2019s&nbsp;<code>Query()<\/code>,&nbsp;<code>Path()<\/code>, en&nbsp;<code>Body()<\/code>&nbsp;parameters.<\/li>\n\n\n\n<li>Voor beveiligde API\u2019s geldt: zorg dat je testtools ook de benodigde API-key header meesturen om de endpoints uit te kunnen proberen.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83c\udf10 API-standaarden: FastAPI en OpenAPI versus anderen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">FastAPI is volledig compliant met&nbsp;<strong>OpenAPI<\/strong>&nbsp;(voorheen Swagger), wat zorgt voor heldere, machine-leesbare documentatie en brede ondersteuning door tools. Dit maakt het eenvoudig om RESTful APIs te ontwerpen en te documenteren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">FastAPI ondersteunt echter niet standaard andere API-standaarden zoals&nbsp;<strong>OData<\/strong>, dat vooral bekend is om zijn uitgebreide query- en filtermogelijkheden binnen URL\u2019s, en veel gebruikt wordt binnen Microsoft-omgevingen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Andere bekende API-standaarden zijn onder meer:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>GraphQL:<\/strong>&nbsp;stelt clients in staat precies te defini\u00ebren welke data ze willen ontvangen, vaak gebruikt voor complexe front-end toepassingen.<\/li>\n\n\n\n<li><strong>gRPC:<\/strong>&nbsp;een protocol voor snelle, typeveilige communicatie tussen microservices.<\/li>\n\n\n\n<li><strong>JSON:API:<\/strong>&nbsp;een standaard voor uniforme structuur en communicatie in RESTful APIs.<\/li>\n\n\n\n<li><strong>SOAP:<\/strong>&nbsp;een oudere, op XML gebaseerde webservice-standaard die nog steeds in veel enterprise-omgevingen voorkomt.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Hoewel FastAPI zich richt op moderne RESTful API\u2019s met OpenAPI, is het mogelijk om met aanvullende libraries sommige andere standaarden te ondersteunen, maar dat vereist extra configuratie en maatwerk. FastAPI is een topkeuze voor RESTful APIs met HTTP\/JSON en OpenAPI-documentatie. Andere standaarden vereisen andere tooling en aanpak die FastAPI niet out-of-the-box ondersteunt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfaf Conclusie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Met een relatief eenvoudige FastAPI-implementatie maak je jouw data warehouse veel beter toegankelijk voor moderne applicaties. Door de juiste structuur, beveiliging en gebruik van standaardtools bouw je snel een betrouwbare REST API die direct waarde toevoegt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Het resultaat:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Meer gebruiksgemak:<\/strong>&nbsp;andere systemen kunnen op een uniforme, webvriendelijke manier data opvragen.<\/li>\n\n\n\n<li><strong>Betere beheerbaarheid:<\/strong>&nbsp;businesslogica blijft waar die hoort \u2014 in het data warehouse \u2014 en API\u2019s blijven eenvoudig en onderhoudbaar.<\/li>\n\n\n\n<li><strong>Veiligheid:<\/strong>&nbsp;met API-keys en HTTPS voorkom je onbevoegde toegang en bescherm je data in transit.<\/li>\n\n\n\n<li><strong>Schaalbaarheid:<\/strong>&nbsp;door endpoints te pagineren en te genereren, houd je ook grotere datasets beheersbaar.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Heb je vragen of wil je hulp bij het bouwen van jouw API? Neem gerust contact op!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udce2 Disclaimer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dit artikel is tot stand gekomen in samenwerking met een AI-taalmodel. De inhoud is bedoeld om je zo goed mogelijk te ondersteunen, maar blijf altijd zelf kritisch en pas voorbeelden aan aan jouw specifieke situatie en beveiligingseisen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Data becomes more valuable the more you can do with it. If you want to maximize the potential of your data warehouse, it helps if other systems can easily access that data. <\/p>","protected":false},"author":16,"featured_media":28487,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[27],"tags":[197,201,203],"industrie-type":[],"interesses":[],"techologie":[],"alistar_language":[],"class_list":["post-26320","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-nl","tag-bi","tag-data-en-bi","tag-powerbi"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Zo zet je een REST API op jouw data warehouse - Alistar<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/alistar.net\/en\/blog\/heres-how-to-set-up-a-rest-api-for-your-data-warehouse\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Zo zet je een REST API op jouw data warehouse - Alistar\" \/>\n<meta property=\"og:description\" content=\"Data wordt waardevoller naarmate je er meer mee kunt doen. Wil je het potentieel van jouw data warehouse vergroten, dan helpt het als andere systemen op een eenvoudige manier toegang kunnen krijgen tot die data.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/alistar.net\/en\/blog\/heres-how-to-set-up-a-rest-api-for-your-data-warehouse\/\" \/>\n<meta property=\"og:site_name\" content=\"Alistar\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-01T09:52:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-02T08:25:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/alistar.net\/wp-content\/uploads\/2025\/07\/shutterstock_2495953041-scaled.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1652\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Shardae Castelen\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Shardae Castelen\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/blog\\\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/blog\\\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\\\/\"},\"author\":{\"name\":\"Shardae Castelen\",\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/#\\\/schema\\\/person\\\/3c047614ccf88bd8927ae653882b3b50\"},\"headline\":\"Zo zet je een REST API op jouw data warehouse\",\"datePublished\":\"2025-07-01T09:52:00+00:00\",\"dateModified\":\"2026-10-02T08:25:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/blog\\\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\\\/\"},\"wordCount\":3008,\"publisher\":{\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/blog\\\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/alistar.net\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/shutterstock_2495953041-scaled.webp\",\"keywords\":[\"BI\",\"Data &amp; BI\",\"Power BI\"],\"articleSection\":[\"Blog NL\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/blog\\\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\\\/\",\"url\":\"https:\\\/\\\/alistar.net\\\/en\\\/blog\\\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\\\/\",\"name\":\"Zo zet je een REST API op jouw data warehouse - Alistar\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/blog\\\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/blog\\\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/alistar.net\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/shutterstock_2495953041-scaled.webp\",\"datePublished\":\"2025-07-01T09:52:00+00:00\",\"dateModified\":\"2026-10-02T08:25:23+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/blog\\\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/alistar.net\\\/en\\\/blog\\\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/blog\\\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\\\/#primaryimage\",\"url\":\"https:\\\/\\\/alistar.net\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/shutterstock_2495953041-scaled.webp\",\"contentUrl\":\"https:\\\/\\\/alistar.net\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/shutterstock_2495953041-scaled.webp\",\"width\":2560,\"height\":1652},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/blog\\\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/alistar.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Zo zet je een REST API op jouw data warehouse\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/alistar.net\\\/en\\\/\",\"name\":\"Alistar\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/alistar.net\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/#organization\",\"name\":\"Alistar\",\"url\":\"https:\\\/\\\/alistar.net\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/alistar.net\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/favicon-new.svg\",\"contentUrl\":\"https:\\\/\\\/alistar.net\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/favicon-new.svg\",\"width\":260,\"height\":260,\"caption\":\"Alistar\"},\"image\":{\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/company\\\/alistar\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/alistar.net\\\/en\\\/#\\\/schema\\\/person\\\/3c047614ccf88bd8927ae653882b3b50\",\"name\":\"Shardae Castelen\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/da4b715240dd773d96635e681af70c4ca1c2efba4cbeddc37b21e50dc5fc9b0c?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/da4b715240dd773d96635e681af70c4ca1c2efba4cbeddc37b21e50dc5fc9b0c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/da4b715240dd773d96635e681af70c4ca1c2efba4cbeddc37b21e50dc5fc9b0c?s=96&d=mm&r=g\",\"caption\":\"Shardae Castelen\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Set Up a REST API for Your Data Warehouse - Alistar","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/alistar.net\/en\/blog\/heres-how-to-set-up-a-rest-api-for-your-data-warehouse\/","og_locale":"en_US","og_type":"article","og_title":"Zo zet je een REST API op jouw data warehouse - Alistar","og_description":"Data wordt waardevoller naarmate je er meer mee kunt doen. Wil je het potentieel van jouw data warehouse vergroten, dan helpt het als andere systemen op een eenvoudige manier toegang kunnen krijgen tot die data.","og_url":"https:\/\/alistar.net\/en\/blog\/heres-how-to-set-up-a-rest-api-for-your-data-warehouse\/","og_site_name":"Alistar","article_published_time":"2025-07-01T09:52:00+00:00","article_modified_time":"2026-10-02T08:25:23+00:00","og_image":[{"width":2560,"height":1652,"url":"https:\/\/alistar.net\/wp-content\/uploads\/2025\/07\/shutterstock_2495953041-scaled.webp","type":"image\/webp"}],"author":"Shardae Castelen","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Shardae Castelen","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/alistar.net\/en\/blog\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\/#article","isPartOf":{"@id":"https:\/\/alistar.net\/en\/blog\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\/"},"author":{"name":"Shardae Castelen","@id":"https:\/\/alistar.net\/en\/#\/schema\/person\/3c047614ccf88bd8927ae653882b3b50"},"headline":"Zo zet je een REST API op jouw data warehouse","datePublished":"2025-07-01T09:52:00+00:00","dateModified":"2026-10-02T08:25:23+00:00","mainEntityOfPage":{"@id":"https:\/\/alistar.net\/en\/blog\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\/"},"wordCount":3008,"publisher":{"@id":"https:\/\/alistar.net\/en\/#organization"},"image":{"@id":"https:\/\/alistar.net\/en\/blog\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\/#primaryimage"},"thumbnailUrl":"https:\/\/alistar.net\/wp-content\/uploads\/2025\/07\/shutterstock_2495953041-scaled.webp","keywords":["BI","Data &amp; BI","Power BI"],"articleSection":["Blog NL"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/alistar.net\/en\/blog\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\/","url":"https:\/\/alistar.net\/en\/blog\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\/","name":"How to Set Up a REST API for Your Data Warehouse - Alistar","isPartOf":{"@id":"https:\/\/alistar.net\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/alistar.net\/en\/blog\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\/#primaryimage"},"image":{"@id":"https:\/\/alistar.net\/en\/blog\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\/#primaryimage"},"thumbnailUrl":"https:\/\/alistar.net\/wp-content\/uploads\/2025\/07\/shutterstock_2495953041-scaled.webp","datePublished":"2025-07-01T09:52:00+00:00","dateModified":"2026-10-02T08:25:23+00:00","breadcrumb":{"@id":"https:\/\/alistar.net\/en\/blog\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/alistar.net\/en\/blog\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/alistar.net\/en\/blog\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\/#primaryimage","url":"https:\/\/alistar.net\/wp-content\/uploads\/2025\/07\/shutterstock_2495953041-scaled.webp","contentUrl":"https:\/\/alistar.net\/wp-content\/uploads\/2025\/07\/shutterstock_2495953041-scaled.webp","width":2560,"height":1652},{"@type":"BreadcrumbList","@id":"https:\/\/alistar.net\/en\/blog\/zo-zet-je-een-rest-api-op-jouw-data-warehouse\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/alistar.net\/"},{"@type":"ListItem","position":2,"name":"Zo zet je een REST API op jouw data warehouse"}]},{"@type":"WebSite","@id":"https:\/\/alistar.net\/en\/#website","url":"https:\/\/alistar.net\/en\/","name":"Alistar","description":"","publisher":{"@id":"https:\/\/alistar.net\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/alistar.net\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/alistar.net\/en\/#organization","name":"Alistar","url":"https:\/\/alistar.net\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/alistar.net\/en\/#\/schema\/logo\/image\/","url":"https:\/\/alistar.net\/wp-content\/uploads\/2025\/07\/favicon-new.svg","contentUrl":"https:\/\/alistar.net\/wp-content\/uploads\/2025\/07\/favicon-new.svg","width":260,"height":260,"caption":"Alistar"},"image":{"@id":"https:\/\/alistar.net\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/alistar\/"]},{"@type":"Person","@id":"https:\/\/alistar.net\/en\/#\/schema\/person\/3c047614ccf88bd8927ae653882b3b50","name":"Shardae Castelen","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/da4b715240dd773d96635e681af70c4ca1c2efba4cbeddc37b21e50dc5fc9b0c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/da4b715240dd773d96635e681af70c4ca1c2efba4cbeddc37b21e50dc5fc9b0c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/da4b715240dd773d96635e681af70c4ca1c2efba4cbeddc37b21e50dc5fc9b0c?s=96&d=mm&r=g","caption":"Shardae Castelen"}}]}},"_links":{"self":[{"href":"https:\/\/alistar.net\/en\/wp-json\/wp\/v2\/posts\/26320","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alistar.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alistar.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alistar.net\/en\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/alistar.net\/en\/wp-json\/wp\/v2\/comments?post=26320"}],"version-history":[{"count":2,"href":"https:\/\/alistar.net\/en\/wp-json\/wp\/v2\/posts\/26320\/revisions"}],"predecessor-version":[{"id":75587,"href":"https:\/\/alistar.net\/en\/wp-json\/wp\/v2\/posts\/26320\/revisions\/75587"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alistar.net\/en\/wp-json\/wp\/v2\/media\/28487"}],"wp:attachment":[{"href":"https:\/\/alistar.net\/en\/wp-json\/wp\/v2\/media?parent=26320"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alistar.net\/en\/wp-json\/wp\/v2\/categories?post=26320"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alistar.net\/en\/wp-json\/wp\/v2\/tags?post=26320"},{"taxonomy":"industrie-type","embeddable":true,"href":"https:\/\/alistar.net\/en\/wp-json\/wp\/v2\/industrie-type?post=26320"},{"taxonomy":"interesses","embeddable":true,"href":"https:\/\/alistar.net\/en\/wp-json\/wp\/v2\/interesses?post=26320"},{"taxonomy":"techologie","embeddable":true,"href":"https:\/\/alistar.net\/en\/wp-json\/wp\/v2\/techologie?post=26320"},{"taxonomy":"alistar_language","embeddable":true,"href":"https:\/\/alistar.net\/en\/wp-json\/wp\/v2\/alistar_language?post=26320"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}