Servizio
Con Netuno è possibile creare Web Service e realizzare qualsiasi tipo di API REST complesse per l'integrazione dei dati tra sistemi.
Un Web Service consente ai sistemi di scambiare informazioni online in modo standardizzato. In Netuno, ogni file all'interno di server/services/ diventa automaticamente un endpoint accessibile via HTTP.
Perché usare i Web Service?
L'uso di servizi asincroni offre chiari benefici per l'esperienza utente:
- Caricamento più rapido: il server fornisce immediatamente la struttura visiva della pagina, senza attendere l'elaborazione di tutti i dati.
- Dati dinamici su richiesta: il frontend richiede solo i dati necessari, quando serve.
- Integrazione tra sistemi: un servizio creato in Netuno può essere consumato da qualsiasi applicazione esterna (mobile, altro sistema web, ecc.).
- Migliore esperienza utente: l'utente non deve attendere l'elaborazione completa della pagina prima di vedere qualcosa sullo schermo.
Prerequisiti
Prima di iniziare, assicurati che:
- Netuno sia installato e in esecuzione in locale.
- L'applicazione
demosia stata creata come descritto in Creare Applicazione. - Ci siano dati registrati in Attività e collegati a Registrazioni (necessario affinché il risultato non sia vuoto).
Configurare l'Editor di Codice
Per creare e modificare i servizi in Netuno, utilizza un editor di codice di tua preferenza. Consigliamo Visual Studio Code perché è gratuito, leggero e altamente intuitivo, ma qualsiasi editor compatibile con JavaScript/Python/Groovy funzionerà normalmente.
Aprire l'Applicazione Demo
- Apri Visual Studio Code.
- Fai clic sull'icona File nel pannello laterale sinistro.
- Seleziona Apri Cartella (File > Open Folder).
- Vai alla cartella di installazione di Netuno.
- Seleziona la directory:
apps/demo - Fai clic su Apri.
La struttura delle cartelle dell'applicazione demo verrà caricata nel pannello sinistro.
Creare il Servizio
I servizi vengono elaborati sul lato server. Per creare un nuovo servizio:
- Nel pannello dei file, espandi la struttura fino a trovare la cartella
server/services/. - Fai clic con il tasto destro sulla cartella
services. - Seleziona Nuovo File
New File. - Assegna un nome al file in base al linguaggio che desideri usare:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
server/services/lavoratori.js
server/services/lavoratori.ts
server/services/lavoratori.py
server/services/lavoratori.rb
server/services/lavoratori.kts
server/services/lavoratori.groovy
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
/**
*** Trasforma i dati della query in output JSON.
*/
const dbRegistrazioni = _db.query(`
SELECT DISTINCT
lavoratore.nome, SUM(DATEDIFF(HOUR, registrazione.inizio, registrazione.fine)) AS totale
FROM lavoratore INNER JOIN registrazione
ON lavoratore.id = registrazione.lavoratore_id
WHERE lavoratore.attivo = true AND registrazione.attivo = true
GROUP BY lavoratore.nome
ORDER BY totale ASC
`);
const lista = _val.list();
for (const dbRegistrazione of dbRegistrazioni) {
lista.add(
_val.map()
.set("nome", dbRegistrazione.getString("nome"))
.set("totale", dbRegistrazione.getInt("totale"))
);
}
_out.json(lista);
/**
*** Trasforma i dati della query in output JSON.
*/
const dbRegistrazioni = _db.query(`
SELECT DISTINCT
lavoratore.nome, SUM(DATEDIFF(HOUR, registrazione.inizio, registrazione.fine)) AS totale
FROM lavoratore INNER JOIN registrazione
ON lavoratore.id = registrazione.lavoratore_id
WHERE lavoratore.attivo = true AND registrazione.attivo = true
GROUP BY lavoratore.nome
ORDER BY totale ASC
`);
const lista = _val.list();
for (const dbRegistrazione of dbRegistrazioni) {
lista.add(
_val.map()
.set("nome", dbRegistrazione.getString("nome"))
.set("totale", dbRegistrazione.getInt("totale"))
);
}
_out.json(lista);
#
# Trasforma i dati della query in output JSON.
#
dbRegistrazioni = _db.query(
"""SELECT DISTINCT
lavoratore.nome, SUM(DATEDIFF(HOUR, registrazione.inizio, registrazione.fine)) AS totale
FROM lavoratore INNER JOIN registrazione
ON lavoratore.id = registrazione.lavoratore_id
WHERE lavoratore.attivo = true AND registrazione.attivo = true
GROUP BY lavoratore.nome
ORDER BY totale ASC"""
)
lista = _val.list()
for dbRegistrazione in dbRegistrazioni:
lista.add(
_val.map()
.set("nome", dbRegistrazione.getString("nome"))
.set("totale", dbRegistrazione.getInt("totale"))
)
_out.json(lista)
#
# Trasforma i dati della query in output JSON.
#
dbRegistrazioni = _db.query(%{
SELECT DISTINCT
lavoratore.nome, SUM(DATEDIFF(HOUR, registrazione.inizio, registrazione.fine)) AS totale
FROM lavoratore INNER JOIN registrazione
ON lavoratore.id = registrazione.lavoratore_id
WHERE lavoratore.attivo = true AND registrazione.attivo = true
GROUP BY lavoratore.nome
ORDER BY totale ASC
})
lista = _val.list()
dbRegistrazioni.each do |dbRegistrazione|
lista.add(
_val.map()
.set("nome", dbRegistrazione.getString("nome"))
.set("totale", dbRegistrazione.getInt("totale"))
)
end
_out.json(lista)
/**
*** Trasforma i dati della query in output JSON.
*/
val dbRegistrazioni = _db.query(
"""SELECT DISTINCT
lavoratore.nome, SUM(DATEDIFF(HOUR, registrazione.inizio, registrazione.fine)) AS totale
FROM lavoratore INNER JOIN registrazione
ON lavoratore.id = registrazione.lavoratore_id
WHERE lavoratore.attivo = true AND registrazione.attivo = true
GROUP BY lavoratore.nome
ORDER BY totale ASC"""
)
val lista = _val.list()
dbRegistrazioni.forEach {
lista.add(
_val.map()
.set("nome", it.getString("nome"))
.set("totale", it.getInt("totale"))
)
}
_out.json(lista)
/**
*** Trasforma i dati della query in output JSON.
*/
def dbRegistrazioni = _db.query("""\
SELECT DISTINCT
lavoratore.nome, SUM(DATEDIFF(HOUR, registrazione.inizio, registrazione.fine)) AS totale
FROM lavoratore INNER JOIN registrazione
ON lavoratore.id = registrazione.lavoratore_id
WHERE lavoratore.attivo = true AND registrazione.attivo = true
GROUP BY lavoratore.nome
ORDER BY totale ASC
""")
def lista = _val.list()
for (dbRegistrazione in dbRegistrazioni) {
lista.add(
_val.map()
.set("nome", dbRegistrazione.getString("nome"))
.set("totale", dbRegistrazione.getInt("totale"))
)
}
_out.json(lista)
Implementa il servizio aggiungendo il codice sotto al file creato. Questo servizio interroga il database e restituisce un elenco di lavoratori con il totale delle ore registrate, in formato JSON.
Comprendere il Codice
| Oggetto/Metodo | Descrizione |
|---|---|
_db.query() | Esegue una query SQL e restituisce un elenco di oggetti in formato chiave-valore (colonna → dato). |
_val.list() | Crea un elenco mutabile per accumulare i risultati. |
_val.map() | Crea un oggetto di mappatura (chiave-valore) per ogni riga di risultato. |
_out.json() | Serializza l'oggetto in JSON e invia la risposta alle richieste HTTP. |
Assicurati che ci siano dati registrati in Attività e collegati a Registrazioni. In caso contrario, l'endpoint restituirà una lista vuota [].
Eseguire e Testare il Servizio
Con Netuno in esecuzione, accedi all'endpoint nel browser:
Il risultato restituito sarà un JSON simile a:
[
{ "nome": "Anna Rossi", "totale": 12 },
{ "nome": "Carlo Bianchi", "totale": 28 },
{ "nome": "Giovanni Costa", "totale": 45 }
]
Prossimi Passi
Ora che il tuo servizio funziona, puoi:
- 📄 Interfaccia & Design — integrare questo servizio nel frontend dell'applicazione.
- 📚 Libreria dei Servizi — esplorare gli oggetti
_db,_val,_oute altri disponibili in Netuno. - 🔗 Aggiungere autenticazione e controllo degli accessi al tuo servizio.