Hypertext Transfer Protocol (HTTP) is de levensduur van het web. Het wordt gebruikt elke keer dat u een document overdraagt, of een AJAX
verzoek. Maar HTTP is verrassend relatief onbekend bij sommige webontwikkelaars.
Deze introductie laat zien hoe de set ontwerpprincipes, bekend als REST, HTTP ondersteunen en u in staat stellen om de grootste kracht ervan te benutten door interfaces te bouwen, die vanaf bijna elk apparaat of besturingssysteem kunnen worden gebruikt.
Envato Market heeft ook duizenden handige codescripts, plug-ins en apps om u te helpen bij webontwikkeling, zoals HTTP Assistant, een app waarmee u online webservices kunt testen.
De HTTP-assistent-app op Envato Market Opnieuw gepubliceerde zelfstudieOm de paar weken bekijken we een aantal van onze favoriete lezers uit de geschiedenis van de site. Deze zelfstudie is voor het eerst gepubliceerd in november 2010.
REST is een eenvoudige manier om interacties tussen onafhankelijke systemen te organiseren.
REST is een eenvoudige manier om interacties tussen onafhankelijke systemen te organiseren. Het is sinds 2005 in populariteit toegenomen en inspireert tot het ontwerpen van services, zoals de Twitter API. Dit komt door het feit dat REST u in staat stelt om te communiceren met minimale overhead met klanten zo divers als mobiele telefoons en andere websites. In theorie is REST niet verbonden met internet, maar bijna altijd als zodanig geïmplementeerd en geïnspireerd door HTTP. Als gevolg hiervan kan REST overal worden gebruikt waar HTTP kan.
Het alternatief is het bouwen van relatief complexe conventies bovenop HTTP. Vaak neemt dit de vorm aan van hele nieuwe op XML gebaseerde talen. Het meest illustere voorbeeld is SOAP. Je moet een geheel nieuwe set conventies leren, maar je gebruikt HTTP nooit volledig. Omdat REST is geïnspireerd door HTTP en speelt op zijn sterke punten, is dit de beste manier om te leren hoe HTTP werkt.
Na een eerste overzicht bekijken we elk van de HTTP-bouwstenen: URL's, HTTP-werkwoorden en reactiecodes. We zullen ook bekijken hoe je ze op een RESTVOLLE manier gebruikt. Onderweg illustreren we de theorie met een voorbeeldtoepassing, die het proces van het bijhouden van gegevens met betrekking tot de klanten van een bedrijf simuleert via een webinterface..
HTTP is het protocol waarmee documenten op het web kunnen worden verzonden.
HTTP is het protocol waarmee documenten op het web kunnen worden verzonden. Een protocol is een set regels die bepaalt welke berichten kunnen worden uitgewisseld en welke berichten passende antwoorden zijn op anderen. Een ander veelgebruikt protocol is POP3, dat u kunt gebruiken om e-mail op uw harde schijf op te halen.
In HTTP zijn er twee verschillende rollen: server en client. In het algemeen start de cliënt altijd het gesprek; de server antwoordt. HTTP is op tekst gebaseerd; dat wil zeggen, berichten zijn in wezen stukjes tekst, hoewel de berichttekst ook andere media kan bevatten. Tekstgebruik maakt het eenvoudig om een HTTP-uitwisseling te controleren.
HTTP-berichten zijn gemaakt van een koptekst en een hoofdtekst. Het lichaam kan vaak leeg blijven; het bevat gegevens die u via het netwerk wilt verzenden om deze volgens de instructies in de kop te gebruiken. De kop bevat metagegevens, zoals coderingsinformatie; maar in het geval van een verzoek bevat het ook de belangrijke HTTP-methoden. In de REST-stijl zult u merken dat header-gegevens vaak belangrijker zijn dan het lichaam.
Als u Chrome-ontwikkelaarstools of Firefox met de Firebug-extensie gebruikt, klikt u op de Netto
paneel en stel het in op ingeschakeld
. U hebt dan de mogelijkheid om de details van de HTTP-verzoeken te bekijken terwijl u surft. Bijvoorbeeld:
Een andere handige manier om vertrouwd te raken met HTTP is om een speciale client te gebruiken, zoals CURL.
cURL is een opdrachtregelprogramma dat beschikbaar is op alle belangrijke besturingssystemen.
Nadat u cURL hebt geïnstalleerd, typt u:
curl -v google.com
Hiermee wordt het volledige HTTP-gesprek weergegeven. Verzoeken worden voorafgegaan door >
, terwijl antwoorden worden voorafgegaan door <
.
URL's zijn de manier waarop u de dingen identificeert waarop u wilt werken. We zeggen dat elke URL een resource identificeert. Dit zijn exact dezelfde URL's die aan webpagina's zijn toegewezen. In feite is een webpagina een type bron. Laten we een meer exotisch voorbeeld nemen en onze voorbeeldtoepassing bekijken, die de lijst met klanten van een bedrijf beheert:
/ cliënten
zal alle cliënten identificeren, terwijl
/ Cliënten / jim
zal de cliënt, genaamd 'Jim', identificeren, ervan uitgaande dat hij de enige is met die naam.
In deze voorbeelden nemen we de hostnaam over het algemeen niet op in de URL, omdat deze niet relevant is vanuit het oogpunt van hoe de interface is georganiseerd. Niettemin is de hostnaam belangrijk om ervoor te zorgen dat de bron-ID uniek is op het hele internet. We zeggen vaak dat u het verzoek verzendt voor een grondstof naar een gastheer. De host wordt afzonderlijk van het resourcepad in de header opgenomen, die direct bovenop de verzoekheader staat:
GET / clients / jim HTTP / 1.1 Host: example.com
Middelen worden het best beschouwd als zelfstandige naamwoorden. Het volgende is bijvoorbeeld niet RESTful:
/ Cliënten / add
Dit komt omdat het een URL gebruikt om een actie te beschrijven. Dit is een vrij fundamenteel punt bij het onderscheiden van RESTful van niet-RESTful-systemen.
Ten slotte moeten URL's zo nauwkeurig zijn als nodig; alles wat nodig is om een bron uniek te identificeren moet in de URL staan. U hoeft geen gegevens op te nemen die de resource in het verzoek identificeren. Op deze manier fungeren URL's als een volledige kaart van alle gegevens die door uw toepassing worden verwerkt.
Maar hoe specificeer je een actie? Hoe vertel je bijvoorbeeld dat je een nieuwe klantrecord wilt maken die is gemaakt in plaats van is opgehaald? Dat is waar HTTP-werkwoorden in het spel komen.
Elke aanvraag specificeert een bepaald HTTP-werkwoord of -methode in de verzoekkop. Dit is het eerste woord met alle hoofdletters in de verzoekkop. Bijvoorbeeld,
GET / HTTP / 1.1
betekent dat de GET-methode wordt gebruikt, terwijl
DELETE / clients / anne HTTP / 1.1
betekent het DELETE
methode wordt gebruikt.
HTTP-werkwoorden vertellen de server wat te doen met de gegevens die worden geïdentificeerd door de URL.
HTTP-werkwoorden vertellen de server wat te doen met de gegevens die worden geïdentificeerd door de URL. Het verzoek kan optioneel extra informatie in zijn hoofdgedeelte bevatten, die nodig kan zijn om de bewerking uit te voeren, bijvoorbeeld gegevens die u met de bron wilt opslaan. U kunt deze gegevens in cURL leveren met de -d
keuze.
Als u ooit HTML-formulieren heeft gemaakt, bent u bekend met twee van de belangrijkste HTTP-werkwoorden: KRIJGEN
en POST
. Maar er zijn veel meer HTTP-werkwoorden beschikbaar. De belangrijkste voor het bouwen van RESTful API zijn KRIJGEN
, POST
, LEGGEN
en DELETE
. Andere methoden zijn beschikbaar, zoals HOOFD
en OPTIES
, maar ze zijn zeldzamer (als je meer wilt weten over alle andere HTTP-methoden, is de officiële bron IETF).
KRIJGEN
is het eenvoudigste type HTTP-verzoekmethode; degene die browsers gebruiken elke keer dat je op een link klikt of een URL in de adresbalk typt. Het instrueert de server om de gegevens die door de URL zijn geïdentificeerd naar de client te verzenden. Gegevens mogen nooit aan de serverzijde worden gewijzigd als gevolg van een KRIJGEN
verzoek. In deze zin, a KRIJGEN
aanvraag is alleen-lezen, maar natuurlijk, zodra de klant de gegevens ontvangt, is het vrij om elke bewerking ermee op zijn eigen kant te doen - bijvoorbeeld, het indelen voor weergave.
EEN LEGGEN
aanvraag wordt gebruikt wanneer u de door de URL geïdentificeerde bron wilt maken of bijwerken. Bijvoorbeeld,
PUT / clients / robin
kan een client maken, genaamd roodborstje
op de server. Dat merk je RUST UIT
is volledig back-end agnostisch; er staat niets in de aanvraag dat de server informeert hoe de gegevens moeten worden aangemaakt - alleen dat het zou moeten. Hiermee kunt u eenvoudig de backend-technologie omwisselen als de behoefte zich zou voordoen. LEGGEN
verzoeken bevatten de gegevens die moeten worden gebruikt bij het bijwerken of maken van de resource in de hoofdtekst. In cURL kunt u gegevens toevoegen aan het verzoek met de -d
schakelaar.
curl -v -X PUT -d "wat tekst"
DELETE
zou het tegendeel van moeten doen LEGGEN
; het moet worden gebruikt wanneer u de bron wilt verwijderen die wordt geïdentificeerd door de URL van het verzoek.
curl -v -X DELETE / clients / anne
Hiermee worden alle gegevens verwijderd die aan de resource zijn gekoppeld, geïdentificeerd door / Cliënten / anne
.
POST
wordt gebruikt wanneer de verwerking die u op de server wilt uitvoeren, moet worden herhaald, als de POST
verzoek wordt herhaald (dat wil zeggen, dat is niet zo idempotent; hieronder meer). In aanvulling op, POST
verzoeken moeten leiden tot de verwerking van de hoofdtekst van het verzoek als ondergeschikte van de URL waarnaar u een bericht verzendt.
In gewone woorden:
POST / klanten /
mag de bron niet veroorzaken / Cliënten /
, zelf, te wijzigen, maar een bron waarvan de URL begint met /clients /
. Het zou bijvoorbeeld een nieuwe klant aan de lijst kunnen toevoegen, met een ID kaart
gegenereerd door de server.
/ Cliënten / some-unieke-id
LEGGEN
aanvragen worden eenvoudig gebruikt in plaats van POST
verzoeken en omgekeerd. Sommige systemen gebruiken slechts één, sommigen gebruiken POST
voor bewerkingen maken, en LEGGEN
voor updateactiviteiten (sinds met een LEGGEN
vraag je altijd om de volledige URL), sommige zelfs gebruiken POST
voor updates en LEGGEN
voor creëert.
Vaak, POST
verzoeken worden gebruikt om bewerkingen op de server te activeren, die niet in de server passen Maken / Bewerken / verwijderen
paradigma; maar dit valt echter buiten de reikwijdte van RUST UIT
. In ons voorbeeld houden we ons aan LEGGEN
helemaal.
KRIJGEN
. De andere zijn onveilig, omdat ze kunnen leiden tot een wijziging van de bronnen. Idempotente methoden: Deze methoden bereiken hetzelfde resultaat, ongeacht hoe vaak het verzoek wordt herhaald: dat zijn ze KRIJGEN
, LEGGEN
, en DELETE
. De enige niet-idempotente methode is POST
. LEGGEN
en DELETE
wordt beschouwd als idempotent kan verrassend zijn, maar het is in feite vrij eenvoudig uit te leggen: het herhalen van a LEGGEN
methode met exact dezelfde instantie zou een resource moeten aanpassen op een manier die identiek blijft aan die beschreven in de vorige LEGGEN
verzoek: er zal niets veranderen! Evenzo heeft het geen zin om een bron twee keer te verwijderen. Hieruit volgt dat het niet uitmaakt hoe vaak een LEGGEN
of DELETE
verzoek wordt herhaald, het resultaat moet hetzelfde zijn alsof het maar één keer was gedaan. Onthouden: jij bent de programmeur, die uiteindelijk beslist wat er gebeurt als een bepaalde HTTP-methode wordt gebruikt. Er is niets inherent aan HTTP-implementaties die automatisch ervoor zorgen dat bronnen worden gemaakt, vermeld, verwijderd of bijgewerkt. U moet voorzichtig zijn om het HTTP-protocol correct toe te passen en deze semantiek zelf af te dwingen.
De HTTP-client en HTTP-server wisselen informatie uit over bronnen die worden geïdentificeerd door URL's.
We kunnen tot nu toe op de volgende manier samenvatten wat we tot nu toe hebben geleerd: de HTTP-client en HTTP-server wisselen informatie uit over bronnen die worden geïdentificeerd door URL's.
We zeggen dat het verzoek en de reactie een weergave van de bron bevatten. Onder representatie verstaan wij informatie, in een bepaald formaat, over de staat van de hulpbron of hoe die toestand in de toekomst zou moeten zijn. Zowel de koptekst als het lichaam zijn stukjes van de afbeelding.
De HTTP-headers, die metadata bevatten, zijn strak gedefinieerd door de HTTP-specificatie; ze kunnen alleen platte tekst bevatten en moeten op een bepaalde manier worden opgemaakt.
De body kan data in elk formaat bevatten, en dit is waar de kracht van HTTP echt uitspringt. U weet dat u platte tekst, afbeeldingen, HTML en XML in elke menselijke taal kunt verzenden. Via metagegevens van verzoeken of verschillende URL's kunt u kiezen uit verschillende weergaven voor dezelfde resource. U kunt bijvoorbeeld een webpagina naar browsers en JSON naar toepassingen verzenden.
De HTTP-reactie moet het inhoudstype van de hoofdtekst specificeren. Dit wordt gedaan in de koptekst, in de Content-Type veld; bijvoorbeeld:
Inhoud / Type: toepassing / json
Eenvoudigheidshalve verzendt onze voorbeeldtoepassing alleen JSON heen en weer, maar de toepassing moet zodanig worden ontworpen dat u het formaat van de gegevens gemakkelijk kunt wijzigen, zodat u kunt afstemmen op verschillende clients of gebruikersvoorkeuren..
cURL is, vaker wel dan niet, de HTTP-client-oplossing van de keuze voor PHP-ontwikkelaars.
Om met de verschillende verzoekmethoden te experimenteren, hebt u een client nodig, waarmee u kunt specificeren welke methode u wilt gebruiken. Helaas komen HTML-formulieren niet overeen, omdat ze u alleen in staat stellen om GET- en POST-verzoeken te doen. In het echte leven worden API's programmatisch benaderd via een afzonderlijke clienttoepassing of via JavaScript in de browser.
Dit is de reden waarom het, naast de server, essentieel is om goede HTTP-clientfuncties beschikbaar te hebben in uw programmeertaal naar keuze.
Een zeer populaire HTTP-clientbibliotheek is, nogmaals, cURL. U bent al bekend met de cURL-opdracht van eerder in deze zelfstudie. cURL bevat zowel een zelfstandig opdrachtregelprogramma als een bibliotheek die door verschillende programmeertalen kan worden gebruikt. In het bijzonder is cURL, vaker wel dan niet de HTTP-clientoplossing van de beste keuze voor PHP-ontwikkelaars. Andere talen, zoals Python, bieden meer native HTTP-clientbibliotheken.
Ik wil de low-level functionaliteit zo veel mogelijk blootstellen.
Onze voorbeeld-PHP-applicatie is extreem barebones. Ik wil de low-level functionaliteit zo veel mogelijk blootstellen, zonder kadermagie. Ik wilde ook geen echte API gebruiken, zoals Twitter, omdat ze onverwachts gewijzigd kunnen worden, je moet authenticatie instellen, wat een gedoe kan zijn, en je kunt de implementatie natuurlijk niet bestuderen.
Om de voorbeeldtoepassing uit te voeren, moet u PHP5 en een webserver installeren, met een mechanisme om PHP uit te voeren. De huidige versie moet minimaal versie 5.2 zijn om toegang te hebben tot de json_encode ()
en json_decode ()
functies.
Wat betreft servers, de meest voorkomende keuze is nog steeds Apache met mod_php, maar je bent vrij om alternatieven te gebruiken waar je je prettig bij voelt. Er is een voorbeeld van een Apache-configuratie, die regels voor herschrijven bevat om u te helpen bij het snel instellen van de applicatie. Alle aanvragen voor een URL, te beginnen met / clients /, moeten naar onze worden gerouteerd server.php het dossier.
In Apache moet je inschakelen mod_rewrite en zet de bijgeleverde mod_rewrite configuratie ergens in uw Apache-configuratie, of uw .htacess het dossier. Deze manier, server.php zal reageren op alle verzoeken van de server. Hetzelfde moet worden bereikt met Nginx, of welke alternatieve server u ook besluit te gebruiken.
Er zijn twee sleutels voor het verwerken van verzoeken op de REST-manier. De eerste sleutel is om een andere verwerking te initiëren, afhankelijk van de HTTP-methode - zelfs als de URL's hetzelfde zijn. In PHP is er een variabele in de $ _SERVER globale array, die bepaalt welke methode is gebruikt om de aanvraag te maken:
$ _SERVER [ 'REQUEST_METHOD']
Deze variabele bevat de methode-naam als een tekenreeks, bijvoorbeeld 'KRIJGEN
','LEGGEN
', enzovoorts.
De andere sleutel is om te weten welke URL is aangevraagd. Om dit te doen gebruiken we een andere standaard PHP-variabele:
$ _SERVER [ 'REQUEST_URI']
Deze variabele bevat de URL die begint bij de eerste schuine streep naar voren. Bijvoorbeeld, als de hostnaam 'example.com
','http://example.com/
' zou terugbrengen '/
', terwijl'http://example.com/test/
' zou terugbrengen '/test/
'.
Laten we eerst proberen te bepalen welke URL is aangeroepen. We houden alleen rekening met URL's die beginnen met 'clients
'. Alle andere zijn ongeldig.
$ resource = array_shift ($ paden); if ($ resource == 'clients') $ name = array_shift ($ paths); if (leeg ($ naam)) $ this-> handle_base ($ methode); else $ this-> handle_name ($ methode, $ naam); else // We behandelen alleen resources onder 'clients' header ('HTTP / 1.1 404 Not Found');
We hebben twee mogelijke uitkomsten:
Als er nog een ID is, nemen we aan dat het de naam van de klant is en deze opnieuw doorsturen naar een andere functie, afhankelijk van de methode
. We gebruiken een schakelaar
verklaring, die moet worden vermeden in een echte toepassing:
switch ($ methode) case 'PUT': $ this-> create_contact ($ name); breken; case 'DELETE': $ this-> delete_contact ($ name); breken; case 'GET': $ this-> display_contact ($ naam); breken; standaard: header ('HTTP / 1.1 405 methode niet toegestaan'); header ('Allow: GET, PUT, DELETE'); breken;
HTTP-antwoordcodes standaardiseren een manier om de klant te informeren over het resultaat van zijn verzoek.
Je hebt misschien gemerkt dat de voorbeeldtoepassing de PHP gebruikt header ()
, sommige vreemd uitziende strings doorgeven als argumenten. De header () functie drukt de HTTP af headers
en zorgt ervoor dat ze op de juiste manier worden opgemaakt. Headers moeten het eerste zijn wat betreft de reactie, dus u moet niets anders uitvoeren voordat u klaar bent met de headers. Soms kan uw HTTP-server worden geconfigureerd om andere headers toe te voegen, naast de headers die u opgeeft in uw code.
Headers bevatten allerlei meta-informatie; bijvoorbeeld de tekstcodering die wordt gebruikt in de hoofdtekst van het bericht of het MIME-type van de inhoud van het hoofdgedeelte. In dit geval specificeren we expliciet de HTTP-responscodes. HTTP-antwoordcodes standaardiseren een manier om de klant te informeren over het resultaat van zijn verzoek. PHP retourneert standaard een 200
antwoordcode, wat betekent dat de reactie succesvol is.
De server moet de meest geschikte HTTP-reactiecode retourneren; Op deze manier kan de klant proberen zijn fouten te herstellen, ervan uitgaande dat er fouten zijn. De meeste mensen zijn bekend met het gemeenschappelijke 404 Niet Gevonden
responscode, maar er zijn veel meer beschikbaar om in een breed scala van situaties te passen.
Houd er rekening mee dat de betekenis van een HTTP-reactiecode niet extreem nauwkeurig is; dit is een gevolg van het feit dat HTTP zelf nogal generiek is. Probeer de responscode te gebruiken die het meest overeenkomt met de situatie die voor u ligt. Dat gezegd hebbende, maak je geen zorgen te veel als je geen exacte pasvorm kunt vinden.
Hier zijn enkele HTTP-responscodes die vaak worden gebruikt met REST:
Deze reactiecode geeft aan dat het verzoek succesvol was.
Dit geeft aan dat het verzoek succesvol was en er een resource is gemaakt. Het wordt gebruikt om het succes van een te bevestigen LEGGEN
of POST
verzoek.
Het verzoek is misvormd. Dit gebeurt vooral met POST
en LEGGEN
verzoeken, wanneer de gegevens geen validatie passeren of in het verkeerde formaat zijn.
Dit antwoord geeft aan dat de vereiste bron niet kon worden gevonden. Dit wordt over het algemeen teruggestuurd naar alle verzoeken die verwijzen naar een URL zonder bijbehorende bron.
Deze fout geeft aan dat u verificatie moet uitvoeren voordat u toegang tot de bron hebt.
De gebruikte HTTP-methode wordt niet ondersteund voor deze bron.
Dit duidt op een conflict. U gebruikt bijvoorbeeld een LEGGEN
verzoek om dezelfde bron twee keer te maken.
Wanneer al het andere faalt; Over het algemeen wordt een 500-antwoord gebruikt wanneer de verwerking mislukt vanwege onvoorziene omstandigheden aan de serverzijde, waardoor de server fouten maakt.
Laten we beginnen met het eenvoudig ophalen van informatie uit de applicatie. We willen de details van de klant, 'jim
', laten we een simpele sturen KRIJGEN
verzoek om de URL voor deze bron:
curl -v http: // localhost: 80 / clients / jim
Hiermee worden de volledige berichtkoppen weergegeven. De laatste regel in het antwoord zal de berichttekst zijn; in dit geval zal het JSON zijn met het adres van Jim (onthoud dat het weglaten van een methode naam zal resulteren in een KRIJGEN
verzoek; ook vervangen localhost: 80
met de servernaam en poort die u gebruikt).
Vervolgens kunnen we de informatie voor alle klanten tegelijk verkrijgen:
curl -v http: // localhost: 80 / clients /
Een nieuwe client maken met de naam Paul ...
curl -v -X PUT http: // localhost: 80 / clients / paul -d '"address": "Sunset Boulevard"
en je ontvangt de lijst met alle klanten die nu Paul bevatten als een bevestiging.
Eindelijk, om een client te verwijderen:
curl -v -X DELETE http: // localhost: 80 / clients / anne
U zult merken dat de geretourneerde JSON geen gegevens meer bevat over Anne.
Als u probeert een niet-bestaande client op te halen, bijvoorbeeld:
curl -v http: // localhost: 80 / clients / jerry
U krijgt een 404-fout, en als u probeert een bestaande client te maken:
curl -v -X PUT http: // localhost: 80 / clients / anne
U ontvangt in plaats daarvan een 409-fout.
Over het algemeen genomen, hoe minder aannames voorbij HTTP die u maakt, hoe beter.
Het is belangrijk om te onthouden dat HTTP is opgezet om te communiceren tussen systemen, die niets anders delen dan een goed begrip van het protocol. Over het algemeen geldt dat hoe minder aannames u buiten HTTP maakt, hoe beter: hierdoor heeft het breedste scala aan programma's en apparaten toegang tot uw API.
Ik heb in deze tutorial PHP gebruikt, omdat dit waarschijnlijk de taal is die het meest bekend is bij Nettuts + -lezers. Dat gezegd hebbende, PHP, hoewel ontworpen voor het web, is waarschijnlijk niet de beste taal om te gebruiken bij het werken op een REST-manier, omdat het werkt LEGGEN
vraagt op een heel andere manier dan KRIJGEN
en POST
.
Naast PHP kunt u het volgende overwegen:
Onder de toepassingen die proberen zich te houden aan REST-principes, is het klassieke voorbeeld het Atom-publicatieprotocol, hoewel het in de praktijk eerlijk gezegd niet vaak wordt gebruikt. Voor een moderne applicatie, die is gebouwd op de filosofie van het gebruik van HTTP ten volle, refereer je naar Apache CouchDB.
En vergeet niet om de selectie van codescripts, plug-ins en apps op Envato Market te bekijken.
Veel plezier!
We hebben een complete handleiding samengesteld om u te helpen JavaScript te leren, of u net bent begonnen als een webontwikkelaar of dat u meer geavanceerde onderwerpen wilt verkennen.