サービス
Netunoでは、Webサービス を作成し、システム間のデータ統合のために、あらゆる種類の複雑な REST API を構築できます。
Webサービスとは?
Webサービスを使用すると、システム同士が標準化された方法でオンライン上で情報を交換できます。Netunoでは、server/services/ 内の各ファイルが自動的にHTTP経由でアクセス可能なエンドポイントになります。
Webサービスを使う理由
非同期サービスを利用すると、ユーザー体験に明確なメリットがあります:
- 高速な読み込み: サーバーはすべてのデータ処理を待たずに、ページの視覚的構造をすぐに配信します。
- 必要に応じた動的データ: フロントエンドは必要なときに必要なデータだけを要求します。
- システム間の統合: Netunoで作成したサービスは、任意の外部アプリケーション(モバイル、別のWebシステムなど)から利用できます。
- より良いユーザー体験: ユーザーは画面に何かが表示される前に、ページの完全な処理を待つ必要がありません。
前提条件
開始する前に、次のことを確認してください:
- Netunoがインストールされ、ローカルで実行されていること。
- アプリケーションの作成 の説明に従って、アプリケーション
demoが作成されていること。 - タスクにデータが登録され、記録と関連付けられていること(戻り値が空にならないために必要です)。
コードエディタの設定
Netunoでサービスを作成・編集するには、お好みのコードエディタを使用してください。Visual Studio Code は無料で軽量、非常に直感的なのでおすすめです。ただし、JavaScript/Python/Groovyに対応したエディタであればどれでも通常どおり動作します。
デモアプリケーションを開く
- Visual Studio Code を開きます。
- 左側のパネルで ファイル アイコンをクリックします。
- フォルダーを開く(File > Open Folder)を選択します。
- Netunoのインストールフォルダーに移動します。
- 次のディレクトリを選択します:
apps/demo - 開くをクリックします。
demo アプリケーションのフォルダー構造が左側のパネルに読み込まれます。
サービスの作成
サービスはサーバー側で処理されます。新しいサービスを作成するには:
- ファイルパネルで、
server/services/フォルダーが見つかるまで構造を展開します。 servicesフォルダーを右クリックします。- 新しいファイル
New Fileを選択します。 - 使用する言語に応じてファイルに名前を付けます:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
server/services/workers.js
server/services/workers.ts
server/services/workers.py
server/services/workers.rb
server/services/workers.kts
server/services/workers.groovy
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
server/services/workers.js
/**
*** クエリのデータをJSON出力に変換します。
*/
const dbRecords = _db.query(`
SELECT DISTINCT
worker.name, SUM(DATEDIFF(HOUR, record.start_time, record.end_time)) AS total
FROM worker INNER JOIN record
ON worker.id = record.worker_id
WHERE worker.active = true AND record.active = true
GROUP BY worker.name
ORDER BY total ASC
`);
const resultList = _val.list();
for (const dbRecord of dbRecords) {
resultList.add(
_val.map()
.set("name", dbRecord.getString("name"))
.set("total", dbRecord.getInt("total"))
);
}
_out.json(resultList);
server/services/workers.ts
/**
*** クエリのデータをJSON出力に変換します。
*/
const dbRecords = _db.query(`
SELECT DISTINCT
worker.name, SUM(DATEDIFF(HOUR, record.start_time, record.end_time)) AS total
FROM worker INNER JOIN record
ON worker.id = record.worker_id
WHERE worker.active = true AND record.active = true
GROUP BY worker.name
ORDER BY total ASC
`);
const resultList = _val.list();
for (const dbRecord of dbRecords) {
resultList.add(
_val.map()
.set("name", dbRecord.getString("name"))
.set("total", dbRecord.getInt("total"))
);
}
_out.json(resultList);
server/services/workers.py
#
# クエリのデータをJSON出力に変換します。
#
dbRecords = _db.query(
"""SELECT DISTINCT
worker.name, SUM(DATEDIFF(HOUR, record.start_time, record.end_time)) AS total
FROM worker INNER JOIN record
ON worker.id = record.worker_id
WHERE worker.active = true AND record.active = true
GROUP BY worker.name
ORDER BY total ASC"""
)
resultList = _val.list()
for dbRecord in dbRecords:
resultList.add(
_val.map()
.set("name", dbRecord.getString("name"))
.set("total", dbRecord.getInt("total"))
)
_out.json(resultList)
server/services/workers.rb
#
# クエリのデータをJSON出力に変換します。
#
dbRecords = _db.query(%{
SELECT DISTINCT
worker.name, SUM(DATEDIFF(HOUR, record.start_time, record.end_time)) AS total
FROM worker INNER JOIN record
ON worker.id = record.worker_id
WHERE worker.active = true AND record.active = true
GROUP BY worker.name
ORDER BY total ASC
})
resultList = _val.list()
dbRecords.each do |dbRecord|
resultList.add(
_val.map()
.set("name", dbRecord.getString("name"))
.set("total", dbRecord.getInt("total"))
)
end
_out.json(resultList)
server/services/workers.kts
/**
*** クエリのデータをJSON出力に変換します。
*/
val dbRecords = _db.query(
"""SELECT DISTINCT
worker.name, SUM(DATEDIFF(HOUR, record.start_time, record.end_time)) AS total
FROM worker INNER JOIN record
ON worker.id = record.worker_id
WHERE worker.active = true AND record.active = true
GROUP BY worker.name
ORDER BY total ASC"""
)
val resultList = _val.list()
dbRecords.forEach {
resultList.add(
_val.map()
.set("name", it.getString("name"))
.set("total", it.getInt("total"))
)
}
_out.json(resultList)
server/services/workers.groovy
/**
*** クエリのデータをJSON出力に変換します。
*/
def dbRecords = _db.query("""\
SELECT DISTINCT
worker.name, SUM(DATEDIFF(HOUR, record.start_time, record.end_time)) AS total
FROM worker INNER JOIN record
ON worker.id = record.worker_id
WHERE worker.active = true AND record.active = true
GROUP BY worker.name
ORDER BY total ASC
""")
def resultList = _val.list()
for (dbRecord in dbRecords) {
resultList.add(
_val.map()
.set("name", dbRecord.getString("name"))
.set("total", dbRecord.getInt("total"))
)
}
_out.json(resultList)
作成したファイルに以下のコードを追加してサービスを実装します。このサービスはデータベースを照会し、登録された合計時間を含む作業者一覧をJSON形式で返します。
コードの理解
| オブジェクト/メソッド | 説明 |
|---|---|
_db.query() | SQLクエリを実行し、キーと値(列 → データ)の形式でオブジェクトのリストを返します。 |
_val.list() | 結果を蓄積するための可変リストを作成します。 |
_val.map() | 結果の各行に対してマッピング(キーと値)オブジェクトを作成します。 |
_out.json() | オブジェクトをJSONにシリアライズし、HTTPリクエストへのレスポンスとして送信します。 |
必要なデータ
タスクにデータが登録され、記録に関連付けられていることを確認してください。そうでない場合、エンドポイントは空のリスト [] を返します。
サービスの実行とテスト
Netunoを実行した状態で、ブラウザからエンドポイントにアクセスします:
JSONを表示するためのヒント
期待される戻り値は次のようなJSONです:
[
{ "name": "佐藤 花子", "total": 12 },
{ "name": "鈴木 一郎", "total": 28 },
{ "name": "田中 太郎", "total": 45 }
]
次のステップ
サービスが動作するようになったので、次に進めます:
- 📄 インターフェースとデザイン — このサービスをアプリケーションのフロントエンドに統合します。
- 📚 サービスライブラリ —
_db、_val、_outなど、Netunoで利用できるオブジェクトを確認します。 - 🔗 サービスに認証とアクセス制御を追加します。