Service
Avec Netuno, il est possible de créer des Web Services et de construire tout type d'API REST complexes pour l'intégration de données entre systèmes.
Un Web Service permet aux systèmes d'échanger des informations en ligne de manière standardisée. Dans Netuno, chaque fichier dans server/services/ devient automatiquement un endpoint accessible via HTTP.
Pourquoi utiliser des Web Services ?
L'utilisation de services asynchrones apporte des bénéfices clairs pour l'expérience utilisateur :
- Chargement plus rapide : le serveur livre la structure visuelle de la page immédiatement, sans attendre le traitement de toutes les données.
- Données dynamiques à la demande : le frontend ne demande que les données nécessaires, quand elles sont nécessaires.
- Intégration entre systèmes : un service créé dans Netuno peut être consommé par n'importe quelle application externe (mobile, autre système web, etc.).
- Meilleure expérience utilisateur : l'utilisateur n'a pas besoin d'attendre le traitement complet de la page avant de voir quelque chose à l'écran.
Prérequis
Avant de commencer, assurez-vous que :
- Netuno est installé et en cours d'exécution en local.
- L'application
demoa été créée comme décrit dans Créer une application. - Des données sont enregistrées dans Tâches et liées à Enregistrements (nécessaire pour que le retour ne soit pas vide).
Configurer l'éditeur de code
Pour créer et modifier des services dans Netuno, utilisez un éditeur de code de votre choix. Nous recommandons Visual Studio Code car il est gratuit, léger et très intuitif, mais tout éditeur compatible avec JavaScript/Python/Groovy fonctionnera normalement.
Ouvrir l'application démo
- Ouvrez Visual Studio Code.
- Cliquez sur l'icône Fichiers dans le panneau latéral gauche.
- Sélectionnez Ouvrir le dossier (Fichier > Ouvrir le dossier).
- Naviguez jusqu'au dossier d'installation de Netuno.
- Sélectionnez le répertoire :
apps/demo - Cliquez sur Ouvrir.
La structure de dossiers de l'application demo sera chargée dans le panneau de gauche.
Créer le service
Les services sont traités côté serveur. Pour créer un nouveau service :
- Dans le panneau des fichiers, développez l'arborescence jusqu'à trouver le dossier
server/services/. - Faites un clic droit sur le dossier
services. - Sélectionnez Nouveau fichier
Nouveau fichier. - Nommez le fichier en fonction du langage que vous souhaitez utiliser :
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
server/services/travailleurs.js
server/services/travailleurs.ts
server/services/travailleurs.py
server/services/travailleurs.rb
server/services/travailleurs.kts
server/services/travailleurs.groovy
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
/**
*** Transforme les données de la requête en sortie JSON.
*/
const dbResultats = _db.query(`
SELECT DISTINCT
travailleur.nom, SUM(DATEDIFF(HOUR, enregistrement.debut, enregistrement.fin)) AS total
FROM travailleur INNER JOIN enregistrement
ON travailleur.id = enregistrement.travailleur_id
WHERE travailleur.actif = true AND enregistrement.actif = true
GROUP BY travailleur.nom
ORDER BY total ASC
`);
const liste = _val.list();
for (const dbResultat of dbResultats) {
liste.add(
_val.map()
.set("nom", dbResultat.getString("nom"))
.set("total", dbResultat.getInt("total"))
);
}
_out.json(liste);
/**
*** Transforme les données de la requête en sortie JSON.
*/
const dbResultats = _db.query(`
SELECT DISTINCT
travailleur.nom, SUM(DATEDIFF(HOUR, enregistrement.debut, enregistrement.fin)) AS total
FROM travailleur INNER JOIN enregistrement
ON travailleur.id = enregistrement.travailleur_id
WHERE travailleur.actif = true AND enregistrement.actif = true
GROUP BY travailleur.nom
ORDER BY total ASC
`);
const liste = _val.list();
for (const dbResultat of dbResultats) {
liste.add(
_val.map()
.set("nom", dbResultat.getString("nom"))
.set("total", dbResultat.getInt("total"))
);
}
_out.json(liste);
#
# Transforme les données de la requête en sortie JSON.
#
dbResultats = _db.query(
"""SELECT DISTINCT
travailleur.nom, SUM(DATEDIFF(HOUR, enregistrement.debut, enregistrement.fin)) AS total
FROM travailleur INNER JOIN enregistrement
ON travailleur.id = enregistrement.travailleur_id
WHERE travailleur.actif = true AND enregistrement.actif = true
GROUP BY travailleur.nom
ORDER BY total ASC"""
)
liste = _val.list()
for dbResultat in dbResultats:
liste.add(
_val.map()
.set("nom", dbResultat.getString("nom"))
.set("total", dbResultat.getInt("total"))
)
_out.json(liste)
#
# Transforme les données de la requête en sortie JSON.
#
dbResultats = _db.query(%{
SELECT DISTINCT
travailleur.nom, SUM(DATEDIFF(HOUR, enregistrement.debut, enregistrement.fin)) AS total
FROM travailleur INNER JOIN enregistrement
ON travailleur.id = enregistrement.travailleur_id
WHERE travailleur.actif = true AND enregistrement.actif = true
GROUP BY travailleur.nom
ORDER BY total ASC
})
liste = _val.list()
dbResultats.each do |dbResultat|
liste.add(
_val.map()
.set("nom", dbResultat.getString("nom"))
.set("total", dbResultat.getInt("total"))
)
end
_out.json(liste)
/**
*** Transforme les données de la requête en sortie JSON.
*/
val dbResultats = _db.query(
"""SELECT DISTINCT
travailleur.nom, SUM(DATEDIFF(HOUR, enregistrement.debut, enregistrement.fin)) AS total
FROM travailleur INNER JOIN enregistrement
ON travailleur.id = enregistrement.travailleur_id
WHERE travailleur.actif = true AND enregistrement.actif = true
GROUP BY travailleur.nom
ORDER BY total ASC"""
)
val liste = _val.list()
dbResultats.forEach {
liste.add(
_val.map()
.set("nom", it.getString("nom"))
.set("total", it.getInt("total"))
)
}
_out.json(liste)
/**
*** Transforme les données de la requête en sortie JSON.
*/
def dbResultats = _db.query("""\
SELECT DISTINCT
travailleur.nom, SUM(DATEDIFF(HOUR, enregistrement.debut, enregistrement.fin)) AS total
FROM travailleur INNER JOIN enregistrement
ON travailleur.id = enregistrement.travailleur_id
WHERE travailleur.actif = true AND enregistrement.actif = true
GROUP BY travailleur.nom
ORDER BY total ASC
""")
def liste = _val.list()
for (dbResultat in dbResultats) {
liste.add(
_val.map()
.set("nom", dbResultat.getString("nom"))
.set("total", dbResultat.getInt("total"))
)
}
_out.json(liste)
Implémentez le service en ajoutant le code ci-dessous au fichier créé. Ce service interroge la base de données et renvoie une liste de travailleurs avec le total d'heures enregistrées, au format JSON.
Comprendre le code
| Objet/Méthode | Description |
|---|---|
_db.query() | Exécute une requête SQL et renvoie une liste d'objets au format clé-valeur (colonne → donnée). |
_val.list() | Crée une liste mutable pour accumuler les résultats. |
_val.map() | Crée un objet de mappage (clé-valeur) pour chaque ligne de résultat. |
_out.json() | Sérialise l'objet en JSON et envoie la réponse aux requêtes HTTP. |
Assurez-vous que des données sont enregistrées dans Tâches et liées à Enregistrements. Sinon, l'endpoint renverra une liste vide [].
Exécuter et tester le service
Avec Netuno en cours d'exécution, accédez à l'endpoint dans le navigateur :
Nous recommandons Firefox pour tester les endpoints directement dans le navigateur, car il formate et affiche la réponse JSON de manière lisible avec coloration syntaxique. Vous pouvez également utiliser des extensions comme JSON Viewer dans Chrome ou des outils comme Postman pour des tests plus avancés.
Le retour attendu sera un JSON similaire à :
[
{ "nom": "Anne Dupont", "total": 12 },
{ "nom": "Charles Martin", "total": 28 },
{ "nom": "Jean Dubois", "total": 45 }
]
Prochaines étapes
Maintenant que votre service fonctionne, vous pouvez :
- 📄 Interface & Design — intégrer ce service au frontend de l'application.
- 📚 Bibliothèque de services — explorer les objets
_db,_val,_outet d'autres disponibles dans Netuno. - 🔗 Ajouter authentification et contrôle d'accès à votre service.