Service
Met Netuno is het mogelijk webservices te maken en elke vorm van complexe REST-API's te bouwen voor gegevensintegratie tussen systemen.
Een webservice maakt het mogelijk dat systemen online informatie uitwisselen op een gestandaardiseerde manier. In Netuno wordt elk bestand in server/services/ automatisch een endpoint dat toegankelijk is via HTTP.
Waarom webservices gebruiken?
Het gebruik van asynchrone services biedt duidelijke voordelen voor de gebruikerservaring:
- Sneller laden: de server levert de visuele structuur van de pagina onmiddellijk, zonder te wachten op de verwerking van alle gegevens.
- Dynamische gegevens op aanvraag: de frontend vraagt alleen de benodigde gegevens op, wanneer dat nodig is.
- Integratie tussen systemen: een in Netuno gemaakte service kan door elke externe applicatie worden gebruikt (mobiel, een ander websysteem, enz.).
- Betere gebruikerservaring: de gebruiker hoeft niet te wachten tot de pagina volledig is verwerkt voordat er iets op het scherm verschijnt.
Vereisten
Voordat u begint, controleert u of:
- Netuno is geïnstalleerd en draait lokaal.
- De applicatie
demois aangemaakt zoals beschreven in Applicatie maken. - Er zijn gegevens geregistreerd in Taken en gekoppeld aan Registraties (nodig zodat de respons niet leeg is).
De code-editor configureren
Om services in Netuno te maken en te bewerken, gebruikt u een code-editor naar keuze. We raden Visual Studio Code aan omdat het gratis, licht en zeer intuïtief is, maar elke editor die compatibel is met JavaScript/Python/Groovy werkt normaal.
De demo-applicatie openen
- Open Visual Studio Code.
- Klik op het pictogram Bestanden in de linkerzijbalk.
- Selecteer Map openen (File > Open Folder).
- Navigeer naar de installatiemap van Netuno.
- Selecteer de map:
apps/demo - Klik op Openen.
De mappenstructuur van de applicatie demo wordt in het linkerpaneel geladen.
De service maken
Services worden aan de serverzijde verwerkt. Om een nieuwe service te maken:
- Vouw in het bestandspaneel de structuur uit tot u de map
server/services/vindt. - Klik met de rechtermuisknop op de map
services. - Selecteer Nieuw bestand (
New File). - Geef het bestand een naam overeenkomstig de taal die u wilt gebruiken:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
server/services/werknemers.js
server/services/werknemers.ts
server/services/werknemers.py
server/services/werknemers.rb
server/services/werknemers.kts
server/services/werknemers.groovy
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
/**
*** Zet de querygegevens om naar JSON-output.
*/
const dbRegistraties = _db.query(`
SELECT DISTINCT
werknemer.naam, SUM(DATEDIFF(HOUR, registratie.start, registratie.einde)) AS totaal
FROM werknemer INNER JOIN registratie
ON werknemer.id = registratie.werknemer_id
WHERE werknemer.actief = true AND registratie.actief = true
GROUP BY werknemer.naam
ORDER BY totaal ASC
`);
const lijst = _val.list();
for (const dbRegistratie of dbRegistraties) {
lijst.add(
_val.map()
.set("naam", dbRegistratie.getString("naam"))
.set("totaal", dbRegistratie.getInt("totaal"))
);
}
_out.json(lijst);
/**
*** Zet de querygegevens om naar JSON-output.
*/
const dbRegistraties = _db.query(`
SELECT DISTINCT
werknemer.naam, SUM(DATEDIFF(HOUR, registratie.start, registratie.einde)) AS totaal
FROM werknemer INNER JOIN registratie
ON werknemer.id = registratie.werknemer_id
WHERE werknemer.actief = true AND registratie.actief = true
GROUP BY werknemer.naam
ORDER BY totaal ASC
`);
const lijst = _val.list();
for (const dbRegistratie of dbRegistraties) {
lijst.add(
_val.map()
.set("naam", dbRegistratie.getString("naam"))
.set("totaal", dbRegistratie.getInt("totaal"))
);
}
_out.json(lijst);
#
# Zet de querygegevens om naar JSON-output.
#
dbRegistraties = _db.query(
"""SELECT DISTINCT
werknemer.naam, SUM(DATEDIFF(HOUR, registratie.start, registratie.einde)) AS totaal
FROM werknemer INNER JOIN registratie
ON werknemer.id = registratie.werknemer_id
WHERE werknemer.actief = true AND registratie.actief = true
GROUP BY werknemer.naam
ORDER BY totaal ASC"""
)
lijst = _val.list()
for dbRegistratie in dbRegistraties:
lijst.add(
_val.map()
.set("naam", dbRegistratie.getString("naam"))
.set("totaal", dbRegistratie.getInt("totaal"))
)
_out.json(lijst)
#
# Zet de querygegevens om naar JSON-output.
#
dbRegistraties = _db.query(%{
SELECT DISTINCT
werknemer.naam, SUM(DATEDIFF(HOUR, registratie.start, registratie.einde)) AS totaal
FROM werknemer INNER JOIN registratie
ON werknemer.id = registratie.werknemer_id
WHERE werknemer.actief = true AND registratie.actief = true
GROUP BY werknemer.naam
ORDER BY totaal ASC
})
lijst = _val.list()
dbRegistraties.each do |dbRegistratie|
lijst.add(
_val.map()
.set("naam", dbRegistratie.getString("naam"))
.set("totaal", dbRegistratie.getInt("totaal"))
)
end
_out.json(lijst)
/**
*** Zet de querygegevens om naar JSON-output.
*/
val dbRegistraties = _db.query(
"""SELECT DISTINCT
werknemer.naam, SUM(DATEDIFF(HOUR, registratie.start, registratie.einde)) AS totaal
FROM werknemer INNER JOIN registratie
ON werknemer.id = registratie.werknemer_id
WHERE werknemer.actief = true AND registratie.actief = true
GROUP BY werknemer.naam
ORDER BY totaal ASC"""
)
val lijst = _val.list()
dbRegistraties.forEach {
lijst.add(
_val.map()
.set("naam", it.getString("naam"))
.set("totaal", it.getInt("totaal"))
)
}
_out.json(lijst)
/**
*** Zet de querygegevens om naar JSON-output.
*/
def dbRegistraties = _db.query("""\
SELECT DISTINCT
werknemer.naam, SUM(DATEDIFF(HOUR, registratie.start, registratie.einde)) AS totaal
FROM werknemer INNER JOIN registratie
ON werknemer.id = registratie.werknemer_id
WHERE werknemer.actief = true AND registratie.actief = true
GROUP BY werknemer.naam
ORDER BY totaal ASC
""")
def lijst = _val.list()
for (dbRegistratie in dbRegistraties) {
lijst.add(
_val.map()
.set("naam", dbRegistratie.getString("naam"))
.set("totaal", dbRegistratie.getInt("totaal"))
)
}
_out.json(lijst)
Implementeer de service door de onderstaande code aan het aangemaakte bestand toe te voegen. Deze service raadpleegt de database en retourneert een lijst van werknemers met het totale aantal geregistreerde uren, in JSON-formaat.
De code begrijpen
| Object/Methode | Beschrijving |
|---|---|
_db.query() | Voert een SQL-query uit en retourneert een lijst van objecten in sleutel-waardevorm (kolom → gegeven). |
_val.list() | Maakt een muteerbare lijst om de resultaten in te verzamelen. |
_val.map() | Maakt een mappingobject (sleutel-waarde) voor elke resultaatrij. |
_out.json() | Serialiseert het object naar JSON en stuurt het antwoord op HTTP-verzoeken. |
Zorg ervoor dat er gegevens zijn geregistreerd in Taken en gekoppeld aan Registraties. Anders retourneert het endpoint een lege lijst [].
De service uitvoeren en testen
Open, met Netuno actief, het endpoint in de browser:
De verwachte respons is een JSON die lijkt op:
[
{ "naam": "Anna de Vries", "totaal": 12 },
{ "naam": "Karel Meijer", "totaal": 28 },
{ "naam": "Jan de Boer", "totaal": 45 }
]
Volgende stappen
Nu uw service werkt, kunt u:
- 📄 Interface & Design — deze service integreren in de frontend van de applicatie.
- 📚 Servicebibliotheek — de objecten
_db,_val,_outen andere die in Netuno beschikbaar zijn verkennen. - 🔗 Authenticatie en toegangscontrole aan uw service toevoegen.