Agenda & voor wie is dit
Dit is een introductieworkshop, geen programmeertraining. Je hebt vooraf geen ervaring met coderen nodig. Aan het eind kun je zelfstandig API's aanroepen, response-data lezen en uitleggen hoe authenticatie werkt — je bouwt vandaag geen eigen API en implementeert geen volledige OAuth-integratie.
| Onderdeel | Duur |
|---|---|
| Wat is een API? | ± 20 min |
| Lab 1 — GET: ophalen, filteren, sorteren | ± 40 min |
| Lab 2 — Schrijven: POST, PUT, DELETE | ± 30 min |
| Lab 3 — Inloggen en beveiligde requests | ± 25 min |
| Lab 4 — Zakelijke case: Microsoft Graph | ± 35 min |
| Quiz & API in code | ± 25 min |
| Spiekbrief & afsluiting | ± 10 min |
Bij elk lab werk je eerst een tijdje zelfstandig (of in duo's); de trainer bespreekt pas ná de oefentijd klassikaal na. Kom je er niet uit? Gebruik eerst de hint, dan pas de oplossing. Sneller klaar? Elk lab heeft een optioneel bonusblok — leuk om te doen, maar nooit verplichte stof.
Wil je verder dan vandaag?
Deze workshop is bewust een introductie voor iedereen, ongeacht voorkennis. Wil je zelf een API bouwen, een volledige OAuth 2.0-flow implementeren of dieper in beveiliging en API-design? Dat behandelen we in de verdiepende workshop API Development — vraag de trainer ernaar.
Wat is een API?
Een API (Application Programming Interface) is een afgesproken manier waarop twee stukken software met elkaar praten. Jij stuurt een verzoek (request) en krijgt een antwoord (response) terug — zonder dat je hoeft te weten hoe de andere kant vanbinnen werkt.
De restaurant-vergelijking
Je zit aan tafel en bestelt bij de ober. Jij hoeft niet te weten hoe de keuken werkt — je geeft je bestelling door en krijgt een gerecht terug. De ober is de API: hij neemt je verzoek aan, brengt het naar de keuken (de server) en komt terug met het resultaat. De menukaart is de documentatie: die vertelt wat je mág bestellen.
Frontend, backend en de API ertussen
De meeste apps bestaan uit drie lagen. De frontend is wat jij ziet en aanraakt (de knoppen en schermen). De backend is waar de gegevens en de logica staan, meestal op een server. De API is het afgesproken doorgeefluik daartussen: de frontend vraagt via de API iets aan de backend en krijgt een antwoord terug. Zie een API daarom als een contract — het legt precies vast hoe je iets mag vragen en wat je terugkrijgt, los van hoe het systeem vanbinnen gebouwd is.
API's zitten overal
Je gebruikt er dagelijks tientallen zonder het te merken:
- Weer-app — haalt de verwachting op bij een weer-API (zoals Buienradar).
- "Inloggen met Google" — de app vraagt via Google's API of jij bent wie je zegt te zijn.
- Betalen in een webshop — de kassa praat via een API met de betaalprovider (iDEAL, Stripe).
- Google Maps in een bezorg-app — de kaart en route komen via de Maps-API binnen.
- KVK-nummer invullen bij een boekhoudpakket — de app haalt via de KVK-API automatisch je bedrijfsnaam en adres op, zodat je die niet zelf hoeft te typen.
Waar worden API's ingezet?
Een API is de lijm tussen software: overal waar twee systemen gegevens moeten uitwisselen, zit er een API tussen. Grofweg kom je ze in vier situaties tegen:
- Tussen een app en zijn server — je mobiele bank-app toont je saldo, maar de gegevens staan op de servers van de bank. De app vraagt ze op via een API. Elke keer dat je scrollt, refresht of iets aanklikt, gaat er een request de deur uit.
- Tussen bedrijfssystemen onderling — de webshop moet een bestelling doorgeven aan het voorraadsysteem, dat weer aan de boekhouding en de pakketvervoerder. Die koppelingen lopen via API's, zodat je gegevens niet handmatig hoeft over te typen.
- Open en publieke data — overheden en instanties stellen data beschikbaar via API's: het KNMI (weer), KVK (bedrijven), OV-reisinformatie, RDW (kentekens). Iedereen mag die opvragen en in eigen apps gebruiken.
- AI en automatisering — tools als ChatGPT, Copilot en Power Automate draaien op API's. Een flow die automatisch een e-mail verstuurt of een AI die een tekst samenvat, doet dat door achter de schermen een API aan te roepen.
Een concreet voorbeeld: online een pizza bestellen
Je plaatst een bestelling in de app. Achter die ene knop gebeurt van alles via API's: je adres wordt gecontroleerd (adres-API), je betaling loopt via iDEAL (betaal-API), de bezorger wordt op een kaart getoond (Maps-API) en je krijgt een bevestigingsmail (mail-API). Vier verschillende bedrijven, netjes aan elkaar geknoopt — zonder dat jij er iets van merkt.
Praktijksituaties: wie gebruikt API's, en waarvoor?
API's zijn geen vakgebied op zich — vrijwel elke IT-rol gebruikt ze, alleen met een ander doel. Herkenbare voorbeelden uit de praktijk:
| Rol | Praktijkvoorbeeld |
|---|---|
| Data engineer | Haalt via een API dagelijks gegevens op uit een webapp of SaaS-platform (bijv. bestellingen uit een webshop) en laadt die in een data warehouse voor rapportages. |
| Backend/software developer | Laat de eigen applicatie praten met een externe dienst — een adresvalidatie-API of een verzendpartner zoals PostNL. |
| Tester / QA | Test endpoints rechtstreeks met Postman, vóórdat de schermen er zijn — sneller en preciezer dan door een UI heen klikken. |
| System-/cloud engineer | Zet via de Azure- of AWS-API automatisch servers of opslag klaar, in plaats van handmatig in een portal te klikken. |
| Power Platform-maker | Bouwt een Power Automate-flow die via een API nieuwe leads uit een CRM ophaalt en in Teams post. |
| Data-analist / BI-specialist | Laat Power BI via een API-koppeling automatisch verse cijfers ophalen, in plaats van elke week een export handmatig te importeren. |
| Security-professional | Controleert of een API alleen met een geldige sleutel bereikbaar is en test of gevoelige data niet per ongeluk publiek staat. |
Val je in geen van deze rollen? Kijk dan naar het patroon, niet de titel: overal waar iemand data ophaalt, doorstuurt of automatiseert tussen twee systemen, zit een API — en de manier waarop je 'm aanroept is in elk vakgebied hetzelfde.
Het vaste patroon: request → response
Dit is het beeld om te onthouden: jij (de user) stuurt via internet een request naar de API, die de database raadpleegt en de gevraagde data als response terugstuurt.
Elke API-aanroep bestaat uit dezelfde onderdelen. Dit is een GET-verzoek om producten op te halen:
En dit krijg je terug — gestructureerde data in JSON-formaat (hier ingekort; de echte response bevat meer velden):
{
"id": 7,
"title": "Chanel Coco Noir Eau De",
"price": 129.99,
"category": "fragrances"
}
Een verzoek heeft altijd deze bouwstenen:
| Onderdeel | Wat het is | Voorbeeld |
|---|---|---|
| Method | Wát je wilt doen | GET ophalen, POST aanmaken |
| URL (endpoint) | Wáár je het vraagt | https://dummyjson.com/products |
| Headers | Extra info over het verzoek | Authorization, Content-Type |
| Body | De data die je meestuurt (alleen bij schrijven) | { "title": "..." } |
Waarom JSON?
JSON (JavaScript Object Notation) is de taal waarin de meeste API's antwoorden. Het is voor mensen leesbaar én voor computers makkelijk te verwerken: sleutels en waarden tussen accolades. Je herkent het aan de "sleutel": waarde-paren — precies zoals hierboven.
Niet alles is JSON: soms XML
De meeste moderne API's geven JSON terug, maar je komt (vooral bij oudere systemen) ook XML tegen (Extensible Markup Language) — dezelfde data, maar verpakt in tags zoals <prijs>129.99</prijs>. Vaak mag je zélf kiezen welk formaat je terugkrijgt met de Accept-header op je verzoek: Accept: application/json vraagt om JSON, Accept: application/xml om XML. Welke formaten een API ondersteunt, staat in de documentatie.
De documentatie: de menukaart van de API
Bij elke API hoort documentatie die precies vertelt wat je mag vragen: welke endpoints er zijn, welke parameters en headers ze verwachten en hoe de response eruitziet. Zonder documentatie tast je in het duister — het is letterlijk de menukaart uit de ober-vergelijking.
Veel API's publiceren die docs in een standaardvorm die je meteen herkent:
- OpenAPI / Swagger — een interactieve pagina waarop je elk endpoint ziet én direct kunt uitproberen ("Try it out") zonder een regel code.
- ReDoc — een strakke, leesbare variant van diezelfde OpenAPI-beschrijving, handig om snel doorheen te scrollen.
De vuistregel voor de hele workshop: loopt iets vast, dan is de documentatie leidend — die vertelt altijd het juiste endpoint, formaat en de vereiste velden.
Onthoud dit ene beeld: jij (client) stuurt een method + URL (+ headers + body) naar de server, en krijgt een statuscode + body terug. Elk lab hierna is een variatie op dit patroon — herken je het, dan kun je met elke API overweg.
Check jezelf — snap je de basis?
Voorbereiding (vóór Lab 1)
Open Postman. Geen installatie? Gebruik de webversie op postman.com (gratis account) of vraag de trainer.
Stuur je allereerste request. Kies method GET, plak de URL, klik Send:
Zie je onderin "status": "ok" en linksonder statuscode 200 OK? Dan werkt alles.
Zo lees je Postman
- Bovenin: method-dropdown, URL-balk, Send.
- Tabbladen: Params (query parameters), Headers, Body.
- Onderin: de response — met statuscode, responstijd en grootte rechtsboven in dat paneel.
- Links: History — elk request dat je stuurt wordt bewaard. Handig om terug te bladeren.
Tip: werk in duo's
Nieuw met dit soort tools? Ga naast iemand zitten die er al eens mee werkte en wissel per opdracht van bestuurder. Uitleggen aan een ander is de snelste manier om het zelf te snappen — daar profiteert de ervaren helft dus net zo goed van.
Op verkenning met GET
In dit lab leer je data ophalen: één item, hele lijsten, gericht zoeken en filteren met parameters, en tot slot een echte dataset uitpluizen. Werk dit lab eerst zelfstandig (of in duo's) door — de trainer bespreekt het pas ná de oefentijd klassikaal na.
A. De basis
1. Haal alle producten op.
Kijk naar het eind van de response: welke drie velden staan daar naast de productenlijst?
Antwoord
total (totaal aantal producten), skip en limit. De API geeft je standaard niet alles, maar de eerste 30 — daarom bestaan limit en skip.
2. Haal één product op. Gebruik deze endpoint — wat is de title?
Antwoord
Het id gaat in het pad, niet in een parameter. De titel staat in het veld title bovenin de response.
3. Maak bewust een fout: vraag een product op dat niet bestaat.
Antwoord
404 Not Found, met een nette foutmelding in de body. Onthoud: 4xx betekent "de fout zit aan jouw kant van de lijn" — hier vroeg je iets dat niet bestaat.
B. Query parameters
4. Bouw parameters via het Params-tabblad. Vraag maximaal 5 producten op en laat alleen title en price zien. Vul de parameters in het tabblad Params in en kijk wat er met de URL-balk gebeurt.
Antwoord
Postman bouwt de URL voor je op: eerste parameter na ?, elke volgende met &.
5. Pagineren. Stel: je toont 10 producten per pagina. Welke request hoort bij pagina 3?
Voorspel eerst: schrijf je URL op vóór je 'm in Postman bouwt. Klopt jeskip-waarde?
Antwoord
Pagina 1 = skip 0, pagina 2 = skip 10, pagina 3 = skip 20. Formule: skip = (pagina − 1) × limit.
C. De speurtocht 🔍
Beantwoord elke vraag met een request — niet door te scrollen. De docs op dummyjson.com/docs/products zijn je menukaart.
6. Wat is het duurste product in de hele catalogus?
Hint
Je hebt drie parameters nodig: één om te sorteren, één voor de sorteerrichting en één om niet de hele lijst op te halen. Ze staan alle drie op deze pagina.
Oplossing
Sorteer aflopend op prijs en vraag alleen het eerste resultaat op. Combineren van parameters is de kern van deze opdracht.
7. Hoeveel producten vindt de zoekterm phone?
Hint
Er is een apart pad voor zoeken (zie de docs) — en het antwoord hoef je niet te tellen: kijk nog eens naar opdracht 1.
Oplossing
Het veld total onderin de response geeft het aantal.
8. Welke categorieën kent de winkel, en hoeveel producten zitten er in smartphones?
Hint
Twee requests. Zoek in de docs naar "category" — let goed op enkelvoud en meervoud in de paden.
Oplossing
Eerst de lijst, dan de categorie zelf (let op: category, enkelvoud) — en weer: total geeft het aantal.
Vastgelopen? Check dit eerst
- 404? Negen van de tien keer een typfout in de URL. Vergelijk letter voor letter met de docs.
- Parameter doet niets? Eerste parameter hoort na een
?, elke volgende na een&. Kijk in het Params-tabblad of alles is aangevinkt. - Zoeken geeft alles terug?
/products/searchzonder?q=...zoekt nergens op. - Verdwaald in de deelnemers-JSON? Gebruik de driehoekjes in Postman om lijsten in/uit te klappen, of de zoekbalk (Ctrl/Cmd + F) in het response-paneel.
Check jezelf — kun je dit nu zonder spieken?
Iets niet? Doe de bijbehorende opdracht nog een keer met een ander product of andere zoekterm — herhaling met variatie werkt.
Bonus — klaar vóór de tijd?
DummyJSON heeft meer dan producten. Verken de recipes-dataset (docs):
- Vind alle recepten uit de Italiaanse keuken. (Tip: er is een pad voor meal-type én voor tags — welke heb je nodig?)
- Wat is het recept met de hoogste rating?
- Zoek een recept dat je vanavond zou willen koken en haal alléén de ingrediëntenlijst op met
select.
D. Wissel van dataset
9. Haal de deelnemersdata van deze groep op. Skills4-IT houdt per workshop bij welke organisaties meedoen:
Dit is geen publieke API maar een eigen, vooraf samengestelde dataset — met uitsluitend fictieve organisaties en fictieve deelnemers. Bekijk de structuur: welk veld bovenaan bevat de lijst met organisaties?
Antwoord
Het veld results — een array met één object per organisatie. Elk object heeft onder meer naam, handelsnaam, adres, activiteiten en deelnemers. De opdrachten hierna draaien allemaal om dit ene bestand.
10. Zoek je eigen bedrijf op. Wat is de handelsnaam van de organisatie met naam Skills4-IT, en in welke plaats is de vestiging?
Hint
Loop door results tot je "naam": "Skills4-IT" vindt. De plaats zit een niveau dieper, in het object adres.
Antwoord
Handelsnaam Skills4-IT Trainingsbureau, gevestigd in Tilburg (adres.plaats). Let op hoe je van het ene niveau (results) naar een geneste laag (adres) navigeert — dat is de kern van JSON lezen.
11. Wie heeft de meeste cursisten meegestuurd? Welke twee organisaties hebben elk 3 deelnemers?
Voorspel eerst: gok welk bedrijf de grootste groep stuurt vóór je gaat tellen in dedeelnemers-lijsten.
Antwoord
Contoso Bank en Northwind Consulting — beide met 3 deelnemers in hun deelnemers-array. Elke organisatie heeft zo'n eigen lijst; sommige zijn leeg ([]).
12. De afmelder. Eén deelnemer heeft de status afgemeld in plaats van aangemeld. Bij welke organisatie hoort die, en welk extra veld staat er bij dit deelnemer-object dat de anderen niet hebben?
Hint
Zoek in de deelnemers-lijsten naar een status die niet "aangemeld" is. Kijk daarna welke velden dit ene deelnemer-object extra heeft.
Antwoord
De afgemelde deelnemer hoort bij Fabrikam Zorg en heeft "status": "afgemeld". Als enige heeft dit object ook aanwezig: false en een opmerking. Mooi voorbeeld dat objecten in dezelfde lijst niet altijd dezelfde velden hoeven te hebben — reken daar in je code nooit blind op.
13. SBI-speurtocht. Welke sbiCode hoort bij de activiteit "Bedrijfsopleiding en -training", en welke twee organisaties hebben die activiteit?
Antwoord
SBI-code 85592. Je vindt 'm bij Skills4-IT en Adatum Software — in hun activiteiten-lijst. Eén organisatie kan meerdere activiteiten hebben, dus dat is óók een array.
Bonus — voor de speurneuzen
- Welke organisaties ontwikkelen software (
sbiCode62010)? (Tip: er zijn er twee.) - Tel alle
deelnemersbij elkaar op: hoeveel mensen doen er in totaal mee? - Van welke deelnemer is de
functieonbekend — en hoe is dat in de data vastgelegd?
Zelf schrijven naar de API
In dit lab schrijf je zelf naar de API: je maakt iets aan, wijzigt het en verwijdert het weer. Ook hier eerst zelfstandig (of in duo's) werken — nabespreking volgt na de oefentijd.
Vooraf: DummyJSON simuleert alle schrijfacties. Je krijgt een realistisch antwoord, maar er wordt niets echt opgeslagen. Je kunt dus niets kapotmaken — experimenteer erop los.
Content-Type: niet elke API wil JSON
De header Content-Type vertelt de server welk soort data je meestuurt. Kies je raw → JSON, dan zet Postman die automatisch op application/json. Maar niet elke API verwacht JSON: sommige willen form-data of x-www-form-urlencoded (denk aan een klassiek webformulier of een bestand-upload). Stuur je het verkeerde formaat, dan snapt de server je body niet en krijg je een 400. De regel blijft: de documentatie is leidend — die vertelt welk bodyformaat de API verwacht.
A. Aanmaken met POST
1. Maak een nieuw product aan. Zo bouw je het request:
- Method: POST URL:
https://dummyjson.com/products/add - Tabblad Body → kies raw → rechts in de dropdown JSON
- Plak deze body (of verzin je eigen product):
{
"title": "Skills4-IT Koffiemok",
"price": 12.50,
"category": "kitchen-accessories"
}
Klik Send. Welke statuscode krijg je, en welk veld heeft de server zelf toegevoegd?
Antwoord
201 Created — en de server heeft een id toegekend. Dat is het vaste patroon bij aanmaken: jij levert de gegevens, de server bepaalt het id.
2. Breek het bewust. Haal een komma of aanhalingsteken weg uit je JSON-body en stuur opnieuw.
Voorspel eerst: welke status-reeks verwacht je — 2xx, 4xx of 5xx? Waarom?Repareer het daarna zelf.
Antwoord
Je krijgt een 400 Bad Request: de server kan je body niet lezen. Dit is dé fout die je in de praktijk het vaakst tegenkomt — leer de foutmelding in de response-body te lezen, daar staat meestal wat er mis is.
B. Wijzigen met PUT
3. Geef product 1 een nieuwe prijs.
{ "price": 19.99 }
Controleer de response: klopt de prijs? En bevat de response óók de velden die je niet meestuurde?
Antwoord
Ja — je krijgt het volledige product terug met de nieuwe prijs. DummyJSON gedraagt zich hier soepel; bij veel echte API's is het verschil strikter: PUT vervangt het hele object, PATCH wijzigt alleen de velden die je meestuurt.
4. Is het echt opgeslagen? Haal product 1 opnieuw op met een GET.
Voorspel eerst: welke prijs verwacht je te zien — 19.99 of de oude? Leg aan je buur uit waarom.Antwoord
De oude prijs. DummyJSON is een sandbox: schrijfacties worden gesimuleerd. Precies zo werk je in de praktijk ook — eerst tegen een testomgeving, nooit direct tegen productie.
C. Verwijderen met DELETE
5. Verwijder product 1. Geen body nodig. Welke twee velden in de response bewijzen dat het "gelukt" is?
Antwoord
isDeleted: true en deletedOn (een tijdstempel). Bedenk: bij een echte API was deze data nu écht weg. DELETE is de method waar je in productie het voorzichtigst mee bent.
Vastgelopen? Check dit eerst
- Rare fout op je POST? Staat het Body-tabblad wél op raw + JSON? "Text" of "form-data" is de nummer 1-fout van dit lab.
- 400 Bad Request? Lees de foutmelding in de response — controleer komma's, aanhalingstekens en of elke
{een}heeft. - 404 op je POST? Aanmaken gaat bij DummyJSON via
/products/add, niet via/products.
Check jezelf — kun je dit nu zonder spieken?
Bonus — klaar vóór de tijd?
- Wijzig product 1 nog eens, maar nu met method PATCH in plaats van PUT. Werkt dat bij DummyJSON? Wat is (bij echte API's) het verschil?
- Maak via
https://dummyjson.com/todos/addeen todo aan. Bekijk eerst in de docs welke velden verplicht zijn — en test wat er gebeurt als je er één weglaat.
Inloggen en beveiligde requests
Theorie: drie vormen van API-authenticatie
Bijna elke serieuze API wil weten wie je bent voordat je erbij mag. Drie vormen kom je verreweg het vaakst tegen — van simpel naar veilig:
| Vorm | Hoe het werkt | Waar je het ziet |
|---|---|---|
| API key | Eén vaste sleutel die je meestuurt in een header (bijv. x-api-key) of soms in de URL. Simpel op te zetten, maar wie de sleutel heeft, kan alles — dus behandel 'm geheim. |
Weer-API's, KVK, Google Maps |
| Bearer token (JWT) | Je logt eerst in met naam en wachtwoord en krijgt een tijdelijk token terug. Dat stuur je mee in de header Authorization: Bearer <token>. Het verloopt vanzelf, dus lekt het uit, dan is de schade beperkt. Dit oefen je zo in dit lab. |
De meeste web-apps en REST-API's |
| OAuth 2.0 | Je geeft een app toegang namens jou zonder je wachtwoord te delen. Je logt in bij de bron (Google, Microsoft) en die geeft de app een token terug. Met een refreshToken blijft dat werken zonder telkens opnieuw in te loggen. |
"Inloggen met Google/Microsoft", Power Platform-connectoren |
De rode draad
Wat je ook gebruikt — API key, Bearer token of OAuth — het eindigt altijd als een header op je request. Het verschil zit in wie je bewijst te zijn: een API key identificeert meestal de app, terwijl een Bearer token en OAuth de ingelogde gebruiker vertegenwoordigen. En de gouden regel voor alle drie: behandel de sleutel of het token als een wachtwoord — nooit delen, nooit in code of documentatie plakken.
A. Eerst voelen: de dichte deur
1. Probeer je profiel op te halen — zonder in te loggen.
Antwoord
401 Unauthorized — "wie ben jij eigenlijk?". Dit endpoint vereist dat je bewijst wie je bent. Dat bewijs gaan we nu halen.
B. Inloggen en het token pakken
2. Log in als testgebruiker Emily.
Body (raw → JSON):
{
"username": "emilys",
"password": "emilyspass"
}
Zoek in de response het veld accessToken en kopieer de hele waarde (de lange tekenreeks die met eyJ... begint) — zónder de aanhalingstekens.
Hulp nodig?
Krijg je een 400? Controleer of je body-tabblad op raw + JSON staat en of de JSON klopt. De response bevat naast accessToken ook een refreshToken — die gebruiken echte apps om een verlopen token te vernieuwen zonder opnieuw in te loggen.
C. Het token gebruiken
3. Nu mét polsbandje naar binnen. Maak opnieuw het request uit stap 1, maar nu:
- Tabblad Authorization → Type: Bearer Token → plak je token in het veld.
- Postman bouwt dan zelf de header
Authorization: Bearer <token>. Typ het woord "Bearer" dus niet zelf nog een keer.
Van wie is dit profiel, en welke statuscode zie je nu?
Antwoord
200 OK met het profiel van Emily Johnson — de gebruiker waarmee je bent ingelogd. Kijk ook eens onder het tabblad Headers van je request: daar zie je de Authorization-header die Postman voor je heeft toegevoegd.
4. Saboteer je eigen token. Haal één teken uit het token weg en stuur opnieuw. Wat krijg je, en waarom is dat goed nieuws?
Antwoord
Weer een 401 (met een melding over een ongeldig token). Goed nieuws, want het bewijst dat de server tokens écht controleert — een bijna-goed token is net zo waardeloos als geen token. Behandel een token daarom als een wachtwoord: nooit delen, nooit in documentatie of code plakken.
Vastgelopen? Check dit eerst
- 401 mét token? Vaak zijn de aanhalingstekens meegekopieerd, of ontbreekt het begin/einde van het token. Kopieer de waarde opnieuw, zonder
". - Nog steeds 401? Typ het woord "Bearer" niet zelf in het tokenveld — Postman zet dat er al voor. Check het resultaat onder het tabblad Headers.
- 400 op de login? Body op raw + JSON, en let op de exacte spelling:
emilys/emilyspass.
Check jezelf — kun je dit nu zonder spieken?
Bonus — klaar vóór de tijd?
- Log opnieuw in, maar voeg aan de body
"expiresInMins": 1toe. Wacht een minuut en probeer/auth/me— je ziet live wat een verlopen token doet. - Haal de producten op via het beveiligde pad
https://dummyjson.com/auth/products— eerst zonder, dan met token. Zelfde data, andere deur. - Log in als een andere gebruiker: kies er een uit
https://dummyjson.com/users(het wachtwoord staat gewoon in de data — het is dan ook nepdata).
Zakelijke case: Microsoft Graph
Tot nu toe werkte je met publieke sandbox-API's. Microsoft Graph is anders: het is de ene centrale API waarmee elke applicatie bij Microsoft 365 kan — mail, agenda, Teams, OneDrive, SharePoint, gebruikers. Elke keer dat een Power Automate-flow een mail leest of Outlook je agenda toont, gebeurt dat via Graph. Hetzelfde request → response-patroon dat je in Lab 1-3 leerde, gebruik je hier gewoon weer — alleen zit er nu een echt Microsoft 365-account achter.
A. Aan de slag met Graph Explorer
1. Open Graph Explorer. Dit is Microsofts eigen "Postman" voor Graph — geen installatie nodig.
Log niet in met je eigen Microsoft-account, tenzij de trainer dat expliciet vraagt. Zonder inloggen gebruikt Graph Explorer automatisch een voorbeeldaccount in een Microsoft-testtenant met nepgegevens — precies wat je nodig hebt om veilig te oefenen.
Controleer linksboven in het scherm of er een voorbeeldtenant/sample-account actief is. Zie je onverwacht je eigen naam staan? Log dan uit en werk verder met het voorbeeldaccount.
B. Je eerste Graph-request
2. Haal je (voorbeeld)profiel op. Plak deze URL in Graph Explorer — de method staat al op GET:
Klik Run query. Welke velden herken je uit de vorige labs?
Antwoord
Zelfde patroon als DummyJSON: een 200 OK met één JSON-object — nu met velden als displayName, mail en jobTitle van het voorbeeldaccount. Endpoint, method en response-structuur ken je al; alleen de databron is nu een echt bedrijfssysteem.
3. Bekijk het tabblad "Access token" onderin Graph Explorer — dit is precies wat je in Lab 3 handmatig deed met accessToken in Postman.
Antwoord
Authorization: Bearer <token> — te zien onder "Request headers". Graph Explorer regelt de hele inlog-flow voor je; in Lab 3 deed je dat stap voor stap zelf.
C. De response beperken: $select en $top
Een volledige Graph-response kan tientallen velden bevatten — vaak meer dan je nodig hebt, en soms gevoeliger dan nodig. Met $select vraag je alleen specifieke velden op; met $top beperk je het aantal resultaten. Zelfde idee als select, limit en skip bij DummyJSON in Lab 1.
4. Haal de laatste 5 e-mails op — alleen onderwerp en datum.
Vergelijk dit met wat je zou krijgen zónder $select. Waarom is dat verschil hier extra belangrijk — meer dan bij een productenlijst?
Antwoord
Zonder $select krijg je de vólledige e-mail terug, inclusief inhoud (body) en afzendergegevens. Dat zijn persoonsgegevens — hoe minder je opvraagt dan nodig, hoe kleiner het privacyrisico. Dit heet dataminimalisatie, en $select is daarvoor je belangrijkste gereedschap.
5. Haal de eerstvolgende 5 agenda-afspraken op.
In welk veld staat het onderwerp van de eerste afspraak, en hoe is de starttijd opgebouwd?
Antwoord
subject bovenaan elk item in de value-array. start en end zijn zelf weer objecten met dateTime en timeZone — precies het soort geneste JSON dat je in Lab 1 bij de organisaties-dataset oefende.
6. Haal de bestanden in de root van OneDrive op.
Welk bestand is het grootst (kijk naar het veld size, in bytes)?
Hint
Graph kan hier ook sorteren via de queryparameter $orderby — of vergelijk de size-waarden gewoon met het oog in de response.
D. Permissies: wie mag wat zien?
Elke Graph-call vereist een permissie (scope) — Graph Explorer vraagt daar bij het inloggen expliciet toestemming voor. Bekijk het tabblad "Modify permissions" naast je request: daar zie je welke permissie bij deze call hoort (bijvoorbeeld Mail.Read voor stap 4, Calendars.Read voor stap 5).
| Soort permissie | Namens wie? | Risico als het misgaat |
|---|---|---|
| Gedelegeerd (delegated) | De ingelogde gebruiker — de app mag alleen zien wat die ene persoon ook zelf mag zien | Beperkt tot die ene gebruiker |
| Applicatie (application) | De hele organisatie, zonder ingelogde gebruiker — vaak gebruikt door achtergronddiensten | Kan in potentie bij data van iedereen in de tenant |
Waarom dit ertoe doet
Graph Explorer test altijd met gedelegeerde permissies — logisch, want je bent zelf ingelogd. Applicatiepermissies zet je op via een appregistratie in Microsoft Entra ID, en dat vraagt bewust beheerdersgoedkeuring: hoe meer een app namens de hele organisatie mag zien, hoe strenger je dat beoordeelt. Dit heet least privilege: vraag nooit meer permissie dan een app daadwerkelijk nodig heeft. Zelf een appregistratie opzetten en applicatiepermissies gebruiken behandelen we in de verdiepende workshop API Development.
E. De opdracht: persoonlijke werkdagassistent
Een medewerker wil in één oogopslag zien: de eerstvolgende agenda-afspraken, de laatste e-mails en recente OneDrive-bestanden. Je hebt de drie requests van onderdeel C al — beantwoord er nu deze vragen bij, per endpoint:
- Welk endpoint gebruik je, en welke HTTP-methode?
- Welke permissie hoort erbij (zie het tabblad "Modify permissions")?
- Welke velden komen terug, en welke zijn voor deze assistent relevant?
- Welk privacyrisico zit er in de volledige response — en hoe beperk je dat met
$select?
Vastgelopen? Check dit eerst
- 403 Forbidden of een consent-melding? De benodigde permissie staat nog niet aan — open "Modify permissions", vink de permissie aan en log opnieuw in bij het voorbeeldaccount.
- Lege
value-array? Het voorbeeldaccount heeft niet altijd afspraken, mails of bestanden — probeer een ander endpoint of vraag de trainer. - Queryparameters lijken genegeerd? Zelfde regel als bij DummyJSON: eerste parameter na
?, de rest na&— en let op het dollarteken vóórselect/top.
Check jezelf — kun je dit nu zonder spieken?
Bonus — van Graph Explorer naar code
Hetzelfde agenda-request, nu in JavaScript met fetch() — vergelijk dit met de FreeToGame-demo verderop:
// accessToken komt uit een eerdere inlogstap (Graph Explorer toont 'm onder "Access token")
const response = await fetch(
"https://graph.microsoft.com/v1.0/me/events?$top=5&$select=subject,start,end",
{ headers: { Authorization: `Bearer ${accessToken}` } }
);
if (!response.ok) {
throw new Error(`Graph-request mislukt: ${response.status}`);
}
const data = await response.json();
console.log(data.value);
Belangrijk: dit token hoort nooit hardcoded in broncode — behandel het net als het token uit Lab 3, als een wachtwoord.
Test je kennis
Van API naar app: de FreeToGame-demo
Tot nu toe stuurde je requests met de hand in Postman. Maar precies datzelfde patroon gebruikt een app ook, alleen dan automatisch in code. Om dat te laten zien pakken we een andere publieke API: FreeToGame — een gratis API die een lijst van free-to-play games teruggeeft. Geen sleutel, geen login: gewoon een GET.
De response is een array van games — elk met een title, genre, thumbnail, game_url en meer:
[
{
"id": 540,
"title": "Fortnite",
"genre": "Shooter",
"platform": "PC (Windows)",
"publisher": "Epic Games",
"thumbnail": "https://www.freetogame.com/g/540/thumbnail.jpg"
},
... honderden games
]
Hetzelfde patroon, nu met fetch()
In JavaScript haal je die data op met fetch() — de code-variant van op Send klikken in Postman:
// Stuur het GET-verzoek en wacht op de response const response = await fetch("https://www.freetogame.com/api/games?platform=windows"); // Zet de JSON-response om naar een bruikbare lijst const games = await response.json(); console.log(games[0].title); // bijv. "Fortnite"
Waarom soms een "CORS-proxy"?
Browsers blokkeren uit veiligheid sommige verzoeken naar een ander domein (Cross-Origin). De demo vangt dat op met een fallback via een proxy. Goed om te weten: in Postman heb je dat probleem niet — daar botst je verzoek niet tegen de beveiliging van de browser.
Bekijk de live demo
In de FreeToGame Explorer ↗ zie je precies dit in actie: de pagina haalt de games live op en laat je zoeken, filteren op genre en sorteren — allemaal gebouwd op die ene GET-request. Klik hierboven op Uitvoeren om eerst de ruwe JSON te zien die eronder zit, en open daarna de demo om te zien wat een app daarvan maakt.
Nog een voorbeeld: landgegevens combineren
Dezelfde fetch()-aanpak, nu met een herkenbaardere zakelijke case: een klantregistratiesysteem dat automatisch landgegevens aanvult zodra iemand een land intypt. De REST Countries API geeft per land onder meer hoofdstad, regio, inwonertal, talen en valuta terug — geen sleutel nodig.
Bekijk de live demo
In de REST Countries Explorer ↗ haalt diezelfde soort fetch()-call alle landen op, met zoeken, filteren op regio en sorteren op inwonertal. Vergelijk de code van deze demo met de FreeToGame-demo hierboven: zelfde patroon, andere databron.
Handige publieke API's om zelf te proberen
Wil je verder oefenen? Deze API's zijn gratis en werken prima in Postman. De meeste hebben geen sleutel nodig — plak de URL en klik op Send (of hieronder op Uitvoeren).
| API | Wat je ermee kunt | Sleutel nodig? |
|---|---|---|
| Open-Meteo | Weersverwachting voor elke locatie ter wereld | Nee |
| REST Countries · demo ↗ | Info over landen: hoofdstad, valuta, vlag, inwoners | Nee |
| PokéAPI | Alle data over Pokémon — ideaal om geneste JSON te oefenen | Nee |
| Open Trivia DB | Quizvragen in allerlei categorieën | Nee |
| JSONPlaceholder | Nep-REST-API om GET/POST/PUT/DELETE te oefenen | Nee |
| Nager.Date | Officiële feestdagen per land en jaar | Nee |
| RDW Open Data | Nederlandse voertuig- en kentekengegevens | Nee |
| Rijksmuseum API | Kunstwerken uit de collectie van het Rijksmuseum | Ja (gratis) |
Bonus — onderzoek je eigen gewenste API
Zoek een API die past bij jouw werk of interesse (uit de lijst hierboven, of iets uit je eigen vakgebied). Beantwoord dan met de documentatie als menukaart:
- Welke basis-URL gebruikt de API, en heeft die een sleutel of login nodig?
- Zoek één interessant endpoint op in de docs en voer het uit in Postman. Welke statuscode krijg je?
- Bekijk de response: welke velden zijn voor jou bruikbaar, en zit er geneste data in (lijsten of objecten in elkaar)?
- Combineer een parameter (filter, zoeken of sorteren) als de API dat ondersteunt.
- Leg aan je buur uit wat je opvroeg en wat je terugkreeg — in het request → response-patroon.
Tip: kom je er niet uit met de docs? Zoek op "<naam API> API documentation" of vraag de trainer om samen de menukaart te lezen.
Spiekbrief
De vier methods
| Method | CRUD | Doet | Body? |
|---|---|---|---|
| GET | Read | Ophalen — verandert niets, veilig te herhalen | nee |
| POST | Create | Nieuw item aanmaken | ja |
| PUT | Update | Wijzigen (PATCH: alleen meegestuurde velden) | ja |
| DELETE | Delete | Verwijderen | meestal niet |
Voorbeeld uit de praktijk: een sociaal netwerk gebruikt GET om berichten te tonen, POST om een nieuw bericht te plaatsen, PUT/PATCH om het te wijzigen en DELETE om het te verwijderen — precies de vier CRUD-acties.
Statuscodes die je moet kennen
| Code | Betekenis |
|---|---|
200 / 201 | Gelukt / aangemaakt |
400 | Jouw request klopt niet (vaak: kapotte JSON of verkeerde parameters) |
401 | Niet (goed) ingelogd — token vergeten, kapot of verlopen |
404 | Bestaat niet — check je URL en het id |
500 | Fout bij de server — niet jouw schuld |
Het eerste cijfer verraadt de familie: 2xx gelukt · 3xx doorverwezen · 4xx de fout zit aan jouw kant · 5xx de fout zit bij de server.
Let op: een 200 betekent alleen dat het technisch lukte — controleer altijd óók de response-body of je echt de juiste gegevens terugkreeg.
DummyJSON-endpoints van vandaag
/products · /products/{id} | alles / één product |
/products/search?q=... | zoeken |
?limit= &skip= &select= &sortBy= &order= | pagineren, velden kiezen, sorteren |
/products/category-list · /products/category/{naam} | categorieën |
/products/add (POST) · /products/{id} (PUT/DELETE) | schrijven — gesimuleerd |
/auth/login → accessToken → header Authorization: Bearer <token> → /auth/me | de token-flow |
Werkt je request niet? Loop dit systematisch af
De snelste manier om een kapot request te repareren is stap voor stap controleren — in deze volgorde:
| 1. Method | Past GET/POST/PUT/DELETE bij wat je wilt doen? |
| 2. URL & endpoint | Letter voor letter juist? Let op typefouten en enkelvoud/meervoud. |
| 3. Parameters | Eerste na ?, de rest na & — en aangevinkt in het Params-tabblad? |
| 4. Headers | Juiste Content-Type? En bij beveiligde endpoints: is het token aanwezig? |
| 5. Body | Geldige JSON (komma's, aanhalingstekens) én het juiste formaat (raw/JSON vs. form-data)? |
| 6. Documentatie | Nog steeds vast? Lees de docs — die is altijd leidend. |
De rode draad
Elke API-interactie is hetzelfde patroon: method + URL + headers (+ body) → statuscode + body. Herken je dat patroon, dan kun je met de documentatie van élke API uit de voeten — van Buienradar tot je eigen bedrijfssystemen.
Zien hoe het in code werkt?
Ditzelfde GET-patroon, maar dan live in de browser met JavaScript fetch(): bekijk het FreeToGame Explorer-voorbeeld ↗. Een echte API-integratie die games ophaalt, filtert en toont — precies wat je vandaag met de hand deed, nu automatisch in code.
Klaar? Deel je ervaring
Je feedback helpt de volgende workshop scherper te maken. Vul kort de evaluatie in — het kost je hooguit een paar minuten.