Usługa
Za pomocą Netuno można tworzyć usługi sieciowe i budować dowolnego rodzaju złożone API REST do integracji danych między systemami.
Usługa sieciowa pozwala systemom wymieniać informacje online w ustandaryzowany sposób. W Netuno każdy plik w server/services/ automatycznie staje się punktem końcowym dostępnym przez HTTP.
Dlaczego warto używać usług sieciowych?
Korzystanie z asynchronicznych usług przynosi wyraźne korzyści dla doświadczenia użytkownika:
- Szybsze ładowanie: serwer natychmiast dostarcza strukturę wizualną strony, nie czekając na przetworzenie wszystkich danych.
- Dane dynamiczne na żądanie: frontend żąda tylko potrzebnych danych, gdy są potrzebne.
- Integracja między systemami: usługa utworzona w Netuno może być używana przez dowolną aplikację zewnętrzną (mobilną, inny system webowy itp.).
- Lepsze doświadczenie użytkownika: użytkownik nie musi czekać na pełne przetworzenie strony, zanim zobaczy cokolwiek na ekranie.
Wymagania wstępne
Przed rozpoczęciem upewnij się, że:
- Netuno jest zainstalowane i uruchomione lokalnie.
- Aplikacja
demozostała utworzona zgodnie z opisem w Tworzenie aplikacji. - W Zadaniach i powiązanych Rejestrach są zapisane dane (potrzebne, aby odpowiedź nie była pusta).
Konfiguracja edytora kodu
Aby tworzyć i edytować usługi w Netuno, użyj edytora kodu według własnych preferencji. Polecamy Visual Studio Code, ponieważ jest darmowy, lekki i bardzo intuicyjny, ale każdy edytor zgodny z JavaScript/Python/Groovy będzie działał normalnie.
Otwieranie aplikacji demo
- Otwórz Visual Studio Code.
- Kliknij ikonę Pliki w lewym panelu bocznym.
- Wybierz Otwórz folder (menu Plik > Otwórz folder).
- Przejdź do folderu instalacyjnego Netuno.
- Wybierz katalog:
apps/demo - Kliknij Otwórz.
Struktura folderów aplikacji demo zostanie wczytana w lewym panelu.
Tworzenie usługi
Usługi są przetwarzane po stronie serwera. Aby utworzyć nową usługę:
- W panelu plików rozwiń strukturę, aż znajdziesz folder
server/services/. - Kliknij prawym przyciskiem myszy na folderze
services. - Wybierz Nowy plik
New File. - Nazwij plik zgodnie z językiem, którego chcesz użyć:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
server/services/pracownicy.js
server/services/pracownicy.ts
server/services/pracownicy.py
server/services/pracownicy.rb
server/services/pracownicy.kts
server/services/pracownicy.groovy
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
/**
*** Przekształca dane zapytania w wynik JSON.
*/
const dbRejestry = _db.query(`
SELECT DISTINCT
pracownik.imie, SUM(DATEDIFF(HOUR, rejestr.poczatek, rejestr.koniec)) AS suma
FROM pracownik INNER JOIN rejestr
ON pracownik.id = rejestr.pracownik_id
WHERE pracownik.aktywny = true AND rejestr.aktywny = true
GROUP BY pracownik.imie
ORDER BY suma ASC
`);
const lista = _val.list();
for (const dbRejestr of dbRejestry) {
lista.add(
_val.map()
.set("imie", dbRejestr.getString("imie"))
.set("suma", dbRejestr.getInt("suma"))
);
}
_out.json(lista);
/**
*** Przekształca dane zapytania w wynik JSON.
*/
const dbRejestry = _db.query(`
SELECT DISTINCT
pracownik.imie, SUM(DATEDIFF(HOUR, rejestr.poczatek, rejestr.koniec)) AS suma
FROM pracownik INNER JOIN rejestr
ON pracownik.id = rejestr.pracownik_id
WHERE pracownik.aktywny = true AND rejestr.aktywny = true
GROUP BY pracownik.imie
ORDER BY suma ASC
`);
const lista = _val.list();
for (const dbRejestr of dbRejestry) {
lista.add(
_val.map()
.set("imie", dbRejestr.getString("imie"))
.set("suma", dbRejestr.getInt("suma"))
);
}
_out.json(lista);
#
# Przekształca dane zapytania w wynik JSON.
#
dbRejestry = _db.query(
"""SELECT DISTINCT
pracownik.imie, SUM(DATEDIFF(HOUR, rejestr.poczatek, rejestr.koniec)) AS suma
FROM pracownik INNER JOIN rejestr
ON pracownik.id = rejestr.pracownik_id
WHERE pracownik.aktywny = true AND rejestr.aktywny = true
GROUP BY pracownik.imie
ORDER BY suma ASC"""
)
lista = _val.list()
for dbRejestr in dbRejestry:
lista.add(
_val.map()
.set("imie", dbRejestr.getString("imie"))
.set("suma", dbRejestr.getInt("suma"))
)
_out.json(lista)
#
# Przekształca dane zapytania w wynik JSON.
#
dbRejestry = _db.query(%{
SELECT DISTINCT
pracownik.imie, SUM(DATEDIFF(HOUR, rejestr.poczatek, rejestr.koniec)) AS suma
FROM pracownik INNER JOIN rejestr
ON pracownik.id = rejestr.pracownik_id
WHERE pracownik.aktywny = true AND rejestr.aktywny = true
GROUP BY pracownik.imie
ORDER BY suma ASC
})
lista = _val.list()
dbRejestry.each do |dbRejestr|
lista.add(
_val.map()
.set("imie", dbRejestr.getString("imie"))
.set("suma", dbRejestr.getInt("suma"))
)
end
_out.json(lista)
/**
*** Przekształca dane zapytania w wynik JSON.
*/
val dbRejestry = _db.query(
"""SELECT DISTINCT
pracownik.imie, SUM(DATEDIFF(HOUR, rejestr.poczatek, rejestr.koniec)) AS suma
FROM pracownik INNER JOIN rejestr
ON pracownik.id = rejestr.pracownik_id
WHERE pracownik.aktywny = true AND rejestr.aktywny = true
GROUP BY pracownik.imie
ORDER BY suma ASC"""
)
val lista = _val.list()
dbRejestry.forEach {
lista.add(
_val.map()
.set("imie", it.getString("imie"))
.set("suma", it.getInt("suma"))
)
}
_out.json(lista)
/**
*** Przekształca dane zapytania w wynik JSON.
*/
def dbRejestry = _db.query("""\
SELECT DISTINCT
pracownik.imie, SUM(DATEDIFF(HOUR, rejestr.poczatek, rejestr.koniec)) AS suma
FROM pracownik INNER JOIN rejestr
ON pracownik.id = rejestr.pracownik_id
WHERE pracownik.aktywny = true AND rejestr.aktywny = true
GROUP BY pracownik.imie
ORDER BY suma ASC
""")
def lista = _val.list()
for (dbRejestr in dbRejestry) {
lista.add(
_val.map()
.set("imie", dbRejestr.getString("imie"))
.set("suma", dbRejestr.getInt("suma"))
)
}
_out.json(lista)
Zaimplementuj usługę, dodając poniższy kod do utworzonego pliku. Ta usługa odpytuje bazę danych i zwraca listę pracowników z łączną liczbą zarejestrowanych godzin w formacie JSON.
Zrozumienie kodu
| Obiekt/Metoda | Opis |
|---|---|
_db.query() | Wykonuje zapytanie SQL i zwraca listę obiektów w formacie klucz-wartość (kolumna → dana). |
_val.list() | Tworzy mutowalną listę do gromadzenia wyników. |
_val.map() | Tworzy obiekt mapowania (klucz-wartość) dla każdego wiersza wyniku. |
_out.json() | Serializuje obiekt do JSON i wysyła odpowiedź na żądania HTTP. |
Upewnij się, że w Zadaniach i powiązanych Rejestrach są zapisane dane. W przeciwnym razie punkt końcowy zwróci pustą listę [].
Uruchamianie i testowanie usługi
Gdy Netuno jest uruchomione, otwórz punkt końcowy w przeglądarce:
Oczekiwany wynik będzie podobny do poniższego JSON:
[
{ "imie": "Anna Kowalska", "suma": 12 },
{ "imie": "Karol Nowak", "suma": 28 },
{ "imie": "Jan Kowalski", "suma": 45 }
]
Następne kroki
Teraz, gdy Twoja usługa działa, możesz:
- 📄 Interfejs i design — zintegrować tę usługę z frontendem aplikacji.
- 📚 Biblioteka usług — poznać obiekty
_db,_val,_outi inne dostępne w Netuno. - 🔗 Dodać uwierzytelnianie i kontrolę dostępu do swojej usługi.