Serviciu
Cu Netuno puteți crea servicii web și construi orice tip de API-uri REST complexe pentru integrarea datelor între sisteme.
Un serviciu web permite sistemelor să facă schimb de informații online într-un mod standardizat. În Netuno, fiecare fișier din server/services/ devine automat un endpoint accesibil prin HTTP.
De ce să folosiți servicii web?
Utilizarea serviciilor asincrone aduce beneficii clare pentru experiența utilizatorului:
- Încărcare mai rapidă: serverul livrează structura vizuală a paginii imediat, fără să aștepte procesarea tuturor datelor.
- Date dinamice la cerere: frontendul solicită doar datele necesare, atunci când este necesar.
- Integrare între sisteme: un serviciu creat în Netuno poate fi consumat de orice aplicație externă (mobilă, alt sistem web etc.).
- Experiență mai bună pentru utilizator: utilizatorul nu trebuie să aștepte procesarea completă a paginii înainte de a vedea ceva pe ecran.
Cerințe preliminare
Înainte de a începe, asigurați-vă că:
- Netuno este instalat și rulează local.
- Aplicația
demoa fost creată conform descrierii din Creați aplicația. - Există date înregistrate în Sarcini și asociate cu Înregistrări (necesar pentru ca răspunsul să nu fie gol).
Configurați editorul de cod
Pentru a crea și edita servicii în Netuno, utilizați un editor de cod preferat. Recomandăm Visual Studio Code deoarece este gratuit, ușor și foarte intuitiv, însă orice editor compatibil cu JavaScript/Python/Groovy va funcționa normal.
Deschideți aplicația demo
- Deschideți Visual Studio Code.
- Faceți clic pe pictograma Fișiere din panoul lateral stâng.
- Selectați Deschideți folderul (File > Open Folder).
- Navigați până la folderul de instalare Netuno.
- Selectați directorul:
apps/demo - Faceți clic pe Deschideți.
Structura de foldere a aplicației demo va fi încărcată în panoul din stânga.
Creați serviciul
Serviciile sunt procesate pe partea de server. Pentru a crea un serviciu nou:
- În panoul de fișiere, extindeți structura până când găsiți folderul
server/services/. - Faceți clic dreapta pe folderul
services. - Selectați Fișier nou
New File. - Denumiți fișierul în funcție de limbajul pe care doriți să îl utilizați:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
server/services/lucratori.js
server/services/lucratori.ts
server/services/lucratori.py
server/services/lucratori.rb
server/services/lucratori.kts
server/services/lucratori.groovy
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
/**
*** Transformă datele interogării în ieșire JSON.
*/
const dbInregistrari = _db.query(`
SELECT DISTINCT
lucrator.nume, SUM(DATEDIFF(HOUR, inregistrare.inceput, inregistrare.sfarsit)) AS total
FROM lucrator INNER JOIN inregistrare
ON lucrator.id = inregistrare.lucrator_id
WHERE lucrator.activ = true AND inregistrare.activ = true
GROUP BY lucrator.nume
ORDER BY total ASC
`);
const lista = _val.list();
for (const dbInregistrare of dbInregistrari) {
lista.add(
_val.map()
.set("nume", dbInregistrare.getString("nume"))
.set("total", dbInregistrare.getInt("total"))
);
}
_out.json(lista);
/**
*** Transformă datele interogării în ieșire JSON.
*/
const dbInregistrari = _db.query(`
SELECT DISTINCT
lucrator.nume, SUM(DATEDIFF(HOUR, inregistrare.inceput, inregistrare.sfarsit)) AS total
FROM lucrator INNER JOIN inregistrare
ON lucrator.id = inregistrare.lucrator_id
WHERE lucrator.activ = true AND inregistrare.activ = true
GROUP BY lucrator.nume
ORDER BY total ASC
`);
const lista = _val.list();
for (const dbInregistrare of dbInregistrari) {
lista.add(
_val.map()
.set("nume", dbInregistrare.getString("nume"))
.set("total", dbInregistrare.getInt("total"))
);
}
_out.json(lista);
#
# Transformă datele interogării în ieșire JSON.
#
dbInregistrari = _db.query(
"""SELECT DISTINCT
lucrator.nume, SUM(DATEDIFF(HOUR, inregistrare.inceput, inregistrare.sfarsit)) AS total
FROM lucrator INNER JOIN inregistrare
ON lucrator.id = inregistrare.lucrator_id
WHERE lucrator.activ = true AND inregistrare.activ = true
GROUP BY lucrator.nume
ORDER BY total ASC"""
)
lista = _val.list()
for dbInregistrare in dbInregistrari:
lista.add(
_val.map()
.set("nume", dbInregistrare.getString("nume"))
.set("total", dbInregistrare.getInt("total"))
)
_out.json(lista)
#
# Transformă datele interogării în ieșire JSON.
#
dbInregistrari = _db.query(%{
SELECT DISTINCT
lucrator.nume, SUM(DATEDIFF(HOUR, inregistrare.inceput, inregistrare.sfarsit)) AS total
FROM lucrator INNER JOIN inregistrare
ON lucrator.id = inregistrare.lucrator_id
WHERE lucrator.activ = true AND inregistrare.activ = true
GROUP BY lucrator.nume
ORDER BY total ASC
})
lista = _val.list()
dbInregistrari.each do |dbInregistrare|
lista.add(
_val.map()
.set("nume", dbInregistrare.getString("nume"))
.set("total", dbInregistrare.getInt("total"))
)
end
_out.json(lista)
/**
*** Transformă datele interogării în ieșire JSON.
*/
val dbInregistrari = _db.query(
"""SELECT DISTINCT
lucrator.nume, SUM(DATEDIFF(HOUR, inregistrare.inceput, inregistrare.sfarsit)) AS total
FROM lucrator INNER JOIN inregistrare
ON lucrator.id = inregistrare.lucrator_id
WHERE lucrator.activ = true AND inregistrare.activ = true
GROUP BY lucrator.nume
ORDER BY total ASC"""
)
val lista = _val.list()
dbInregistrari.forEach {
lista.add(
_val.map()
.set("nume", it.getString("nume"))
.set("total", it.getInt("total"))
)
}
_out.json(lista)
/**
*** Transformă datele interogării în ieșire JSON.
*/
def dbInregistrari = _db.query("""\
SELECT DISTINCT
lucrator.nume, SUM(DATEDIFF(HOUR, inregistrare.inceput, inregistrare.sfarsit)) AS total
FROM lucrator INNER JOIN inregistrare
ON lucrator.id = inregistrare.lucrator_id
WHERE lucrator.activ = true AND inregistrare.activ = true
GROUP BY lucrator.nume
ORDER BY total ASC
""")
def lista = _val.list()
for (dbInregistrare in dbInregistrari) {
lista.add(
_val.map()
.set("nume", dbInregistrare.getString("nume"))
.set("total", dbInregistrare.getInt("total"))
)
}
_out.json(lista)
Implementați serviciul adăugând codul de mai jos în fișierul creat. Acest serviciu interoghează baza de date și returnează o listă de lucrători cu totalul orelor înregistrate, în format JSON.
Înțelegerea codului
| Obiect/Metodă | Descriere |
|---|---|
_db.query() | Execută o interogare SQL și returnează o listă de obiecte în format cheie-valoare (coloană → valoare). |
_val.list() | Creează o listă mutabilă pentru acumularea rezultatelor. |
_val.map() | Creează un obiect de mapare (cheie-valoare) pentru fiecare rând de rezultat. |
_out.json() | Serializează obiectul în JSON și trimite răspunsul la cererile HTTP. |
Asigurați-vă că există date înregistrate în Sarcini și asociate cu Înregistrări. În caz contrar, endpointul va returna o listă goală [].
Rulați și testați serviciul
Cu Netuno în execuție, accesați endpointul în browser:
Răspunsul așteptat va fi un JSON similar cu:
[
{ "nume": "Ana Popescu", "total": 12 },
{ "nume": "Mihai Ionescu", "total": 28 },
{ "nume": "Ion Dumitrescu", "total": 45 }
]
Pașii următori
Acum că serviciul dumneavoastră funcționează, puteți:
- 📄 Interfață și design — integrați acest serviciu în frontendul aplicației.
- 📚 Biblioteca de servicii — explorați obiectele
_db,_val,_outși altele disponibile în Netuno. - 🔗 Adăugați autentificare și control de acces la serviciul dumneavoastră.