Сервис
С помощью Netuno можно создавать веб-сервисы и строить любые сложные API REST для интеграции данных между системами.
Веб-сервис позволяет системам обмениваться информацией онлайн по стандартизированному протоколу. В Netuno каждый файл в server/services/ автоматически становится эндпоинтом, доступным по HTTP.
Зачем использовать веб-сервисы?
Использование асинхронных сервисов дает очевидные преимущества для пользовательского опыта:
- Более быстрая загрузка: сервер сразу отдает визуальную структуру страницы, не дожидаясь обработки всех данных.
- Динамические данные по требованию: фронтенд запрашивает только необходимые данные, когда это нужно.
- Интеграция между системами: сервис, созданный в Netuno, может использоваться любым внешним приложением (мобильным, другой веб-системой и т. д.).
- Лучший пользовательский опыт: пользователю не нужно ждать полной обработки страницы, чтобы увидеть что-то на экране.
Предварительные требования
Перед началом убедитесь, что:
- Netuno установлен и запущен локально.
- Приложение
демосоздано, как описано в Создание приложения. - Есть данные, зарегистрированные в Задачах и связанные с Записями (необходимо, чтобы возврат не был пустым).
Настройка редактора кода
Для создания и редактирования сервисов в Netuno используйте редактор кода на ваш выбор. Мы рекомендуем Visual Studio Code, так как он бесплатный, легкий и очень интуитивный, но подойдет любой редактор, совместимый с JavaScript/Python/Groovy.
Открыть приложение демо
- Откройте Visual Studio Code.
- Нажмите значок Файлы на левой боковой панели.
- Выберите Открыть папку (File > Open Folder).
- Перейдите в папку установки Netuno.
- Выберите каталог:
apps/демо - Нажмите Открыть.
Структура папок приложения демо загрузится на левой панели.
Создать сервис
Сервисы обрабатываются на стороне сервера. Чтобы создать новый сервис:
- На панели файлов разверните структуру до папки
server/services/. - Щелкните правой кнопкой мыши папку
services. - Выберите Новый файл
New File. - Назовите файл в соответствии с языком, который хотите использовать:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
server/services/работники.js
server/services/работники.ts
server/services/работники.py
server/services/работники.rb
server/services/работники.kts
server/services/работники.groovy
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
/**
*** Преобразует данные запроса в вывод JSON.
*/
const записиБД = _db.query(`
SELECT DISTINCT
работник.имя, SUM(DATEDIFF(HOUR, запись.начало, запись.конец)) AS всего
FROM работник INNER JOIN запись
ON работник.id = запись.работник_id
WHERE работник.активен = true AND запись.активен = true
GROUP BY работник.имя
ORDER BY всего ASC
`);
const список = _val.list();
for (const записьБД of записиБД) {
список.add(
_val.map()
.set("имя", записьБД.getString("имя"))
.set("всего", записьБД.getInt("всего"))
);
}
_out.json(список);
/**
*** Преобразует данные запроса в вывод JSON.
*/
const записиБД = _db.query(`
SELECT DISTINCT
работник.имя, SUM(DATEDIFF(HOUR, запись.начало, запись.конец)) AS всего
FROM работник INNER JOIN запись
ON работник.id = запись.работник_id
WHERE работник.активен = true AND запись.активен = true
GROUP BY работник.имя
ORDER BY всего ASC
`);
const список = _val.list();
for (const записьБД of записиБД) {
список.add(
_val.map()
.set("имя", записьБД.getString("имя"))
.set("всего", записьБД.getInt("всего"))
);
}
_out.json(список);
#
# Преобразует данные запроса в вывод JSON.
#
записиБД = _db.query(
"""SELECT DISTINCT
работник.имя, SUM(DATEDIFF(HOUR, запись.начало, запись.конец)) AS всего
FROM работник INNER JOIN запись
ON работник.id = запись.работник_id
WHERE работник.активен = true AND запись.активен = true
GROUP BY работник.имя
ORDER BY всего ASC"""
)
список = _val.list()
for записьБД in записиБД:
список.add(
_val.map()
.set("имя", записьБД.getString("имя"))
.set("всего", записьБД.getInt("всего"))
)
_out.json(список)
#
# Преобразует данные запроса в вывод JSON.
#
записиБД = _db.query(%{
SELECT DISTINCT
работник.имя, SUM(DATEDIFF(HOUR, запись.начало, запись.конец)) AS всего
FROM работник INNER JOIN запись
ON работник.id = запись.работник_id
WHERE работник.активен = true AND запись.активен = true
GROUP BY работник.имя
ORDER BY всего ASC
})
список = _val.list()
записиБД.each do |записьБД|
список.add(
_val.map()
.set("имя", записьБД.getString("имя"))
.set("всего", записьБД.getInt("всего"))
)
end
_out.json(список)
/**
*** Преобразует данные запроса в вывод JSON.
*/
val записиБД = _db.query(
"""SELECT DISTINCT
работник.имя, SUM(DATEDIFF(HOUR, запись.начало, запись.конец)) AS всего
FROM работник INNER JOIN запись
ON работник.id = запись.работник_id
WHERE работник.активен = true AND запись.активен = true
GROUP BY работник.имя
ORDER BY всего ASC"""
)
val список = _val.list()
записиБД.forEach {
список.add(
_val.map()
.set("имя", it.getString("имя"))
.set("всего", it.getInt("всего"))
)
}
_out.json(список)
/**
*** Преобразует данные запроса в вывод JSON.
*/
def записиБД = _db.query("""\ SELECT DISTINCT
работник.имя, SUM(DATEDIFF(HOUR, запись.начало, запись.конец)) AS всего
FROM работник INNER JOIN запись
ON работник.id = запись.работник_id
WHERE работник.активен = true AND запись.активен = true
GROUP BY работник.имя
ORDER BY всего ASC
""")
def список = _val.list()
for (записьБД in записиБД) {
список.add(
_val.map()
.set("имя", записьБД.getString("имя"))
.set("всего", записьБД.getInt("всего"))
)
}
_out.json(список)
Реализуйте сервис, добавив приведенный ниже код в созданный файл. Этот сервис запрашивает базу данных и возвращает список работников с общим количеством зарегистрированных часов в формате JSON.
Понимание кода
| Объект/Метод | Описание |
|---|---|
_db.query() | Выполняет SQL-запрос и возвращает список объектов в формате ключ-значение (столбец → данные). |
_val.list() | Создает изменяемый список для накопления результатов. |
_val.map() | Создает объект сопоставления (ключ-значение) для каждой строки результата. |
_out.json() | Сериализует объект в JSON и отправляет ответ на HTTP-запросы. |
Убедитесь, что есть данные, зарегистрированные в Задачах и связанные с Записями. Иначе эндпоинт вернет пустой список [].
Запуск и тестирование сервиса
Когда Netuno запущен, откройте эндпоинт в браузере:
Рекомендуем Firefox для тестирования эндпоинтов прямо в браузере, так как он форматирует и отображает JSON-ответ в удобном для чтения виде с подсветкой синтаксиса. В качестве альтернативы используйте расширения, такие как JSON Viewer в Chrome, или инструменты вроде Postman для более продвинутого тестирования.
Ожидаемый ответ будет JSON, похожим на:
[
{ "имя": "Анна Силва", "всего": 12 },
{ "имя": "Карлос Мендес", "всего": 28 },
{ "имя": "Жуан Коста", "всего": 45 }
]
Следующие шаги
Теперь, когда ваш сервис работает, вы можете:
- 📄 Интерфейс и дизайн — интегрировать этот сервис во фронтенд приложения.
- 📚 Библиотека сервисов — изучить объекты
_db,_val,_outи другие, доступные в Netuno. - 🔗 Добавить аутентификацию и контроль доступа к вашему сервису.