Upload
kiyoshi-sawada
View
39
Download
0
Embed Size (px)
Citation preview
EWD 3トレーニング・コース #33
ewd-xpress アプリケーションから
REST / Web サービスにアクセスするM/Gateway Developments Ltd.
Rob Tweed訳 : 日本ダイナシステム株式会社 嶋 芳成
GT.M 版編集 : 澤田 潔
※ 本稿オリジナルは Cache’ 向けとして編纂
05/02/2023 2
対話型 対 REST アプリケーション• 対話型アプリケーション• ewd-xpress バックエンドは、データベースやビ
ジネスロジックに直接アクセスします• 多分、従来のアプリケーション・ロジックを含みます
• REST• アプリケーション・ロジックは他のサーバーにあ
り、 REST / Web サービス呼び出し経由でアクセスします• ewd-xpress バックエンドは他のサーバーに対し
ては REST/HTTP 要求を送ります
EWD 3 トレーニング・コース #33
05/02/2023 3
ewd-xpress
ewd-qoper8 の
キュー
ewd-session GT.M
カスタム・ワーカー・モ
ジュール
demo1.js
従来アプリのロジック関数グローバ
ル
Express
自給自足の対話型アプリケーション
EWD 3 トレーニング・コース #33
ブラウザ
socket.io
socket.io
ewd-clientトーク
ン
05/02/2023 4
ewd-xpress の REST バックエンド
EWD 3 トレーニング・コース #33
HTTP クライアント ewd-xpress
ewd-qoper8 の
キュー
GT.M
カスタム・ワーカー・モ
ジュール
demo1.js
従来アプリのロジック関数グローバ
ルHTTP
Express
05/02/2023 5
ewd-qoper8-vistarpc のバックエンド
EWD 3 トレーニング・コース #33
HTTP クライアント ewd-qoper8-vistarpc
ewd-qoper8 の
キュー
GT.M
カスタム・ワーカー・モ
ジュール
vista-worker-module.js
従来アプリのロジック
インターフェース関数HTTP
Express
05/02/2023 6
REST サービスにアクセスする ewd-xpress
EWD 3 トレーニング・コース #33
ブラウザ ewd-xpress
socket.io
socket.io
ewd-clientトーク
ン
ewd-qoper8 のキュー
ewd-session GT.M
カスタム・ワーカー・モ
ジュール
demo1.js
Express
別の REST /Web サービスHTTP
05/02/2023 7
REST サービスにアクセスする ewd-xpress
EWD 3 トレーニング・コース #33
ブラウザ ewd-xpress
socket.io
socket.io
ewd-clientトーク
ン
ewd-qoper8 のキュー
ewd-session GT.M
カスタム・ワーカー・モ
ジュール
demo1.js
Express
ewd-xpress
ewd-qoper8 のキュー
GT.M
カスタム・ワーカー・モ
ジュール
demo1.js
従来アプリのロジック
関数グローバル
Express
HTTP
05/02/2023 8
ewd-qoper8-vistapc にアクセスする ewd-xpress
EWD 3 トレーニング・コース #33
ブラウザ ewd-xpress
socket.io
socket.io
ewd-clientトーク
ン
ewd-qoper8 のキュー
ewd-session GT.M
カスタム・ワーカー・モ
ジュール
demo1.js
Express
ewd-qoper8-vistarpc
ewd-qoper8 のキュー
GT.M
カスタム・ワーカー・モ
ジュール
vista-worker-module.js
従来アプリのロジック
インターフェース関数
Express
HTTP
05/02/2023 9
REST サービスにアクセスする ewd-xpress
EWD 3 トレーニング・コース #33
ブラウザ ewd-xpress
socket.io
socket.io
ewd-clientトーク
ン
ewd-qoper8 のキュー
ewd-session GT.M
カスタム・ワーカー・モ
ジュール
demo1.js
Express
別の REST /Web サービスHTTP
これを可能にするには、ここで何をすべてぎしょうか?
05/02/2023 10
Node.js から HTTP クライアント・アクセス• バックエンドのメッセージ・ハンドラ関数が
HTTP クライアントとして働かなくてはなりません• Node.js はこのためのライブラリを提供して
います• しかしこれはとても低レベルのものなので、利用
するのはなかなか複雑です
EWD 3 トレーニング・コース #33
05/02/2023 11
Node.js から HTTP クライアント・アクセス• バックエンドのメッセージ・ハンドラ関数が
HTTP クライアントとして働かなくてはなりません• Node.js はこのためのライブラリを提供して
います• しかしこれはとても低レベルのものなので、利用
するのはなかなか複雑です
• Node.js ライブラリを再パッケージする、ビルド済みのモジュールを用いるのが、より良く、より容易です• request が多分最善で、最もよく使われています
EWD 3 トレーニング・コース #33
05/02/2023 12
request モジュールをインストールする• cd ~/ewd3• npm install request
EWD 3 トレーニング・コース #33
05/02/2023 13
REST サービスを用いてログインする• このトレーニング・コースの前の部分
で、 ewd-qoper8-vistarpc の REST API を見てきました• ewd-qoper8-vistarpc の /login という
REST 要求を用いるように demo1 アプリケーションを修正しましょう
EWD 3 トレーニング・コース #33
05/02/2023 14
Login サービスを編集する
• パート #30 で Login サービス・モジュールを作りました• Login メッセージに対するバックエンドの
メッセージ・ハンドラーは、下記のディレクトリにあります• Login/lib/Login.js
• 我々は、これを編集して、 ewd-qoper8-vistrpc の /login REST 要求を用いるようにできます
EWD 3 トレーニング・コース #33
05/02/2023 15
Login/lib/Login.js を編集するvar request = require('request');
module.exports = { handlers: { login: function(messageObj, session, send,finished) { if (session.authenticated) { finished({error: 'You are already logged in!}); return; } var username = messageObj.params.username; if (username === '') { finished({error: 'You must enter a username'}); return; } var password = messageObj.params.password; if (password === '') { finished({error: 'You must enter a password'}); return; } var options = { url: 'http://192.168.1.188:8080/vista/login', method: 'POST', body: { accessCode: username, verifyCode: password }, json: ture }; request(options, function(error, response, body) { if (error) { finished({error: error}); } else { finished(body); } }); } }};
EWD 3 トレーニング・コース #33
05/02/2023 16
Login/lib/Login.js を編集するvar request = require('request');
module.exports = { handlers: { login: function(messageObj, session, send,finished) { if (session.authenticated) { finished({error: 'You are already logged in!}); return; } var username = messageObj.params.username; if (username === '') { finished({error: 'You must enter a username'}); return; } var password = messageObj.params.password; if (password === '') { finished({error: 'You must enter a password'}); return; } var options = { url: 'http://192.168.1.188:8080/vista/login', method: 'POST', body: { accessCode: username, verifyCode: password }, json: ture }; request(options, function(error, response, body) { if (error) { finished({error: error}); } else { finished(body); } }); } }};
EWD 3 トレーニング・コース #33
request モジュールを読み込む
05/02/2023 17
Login/lib/Login.js を編集するvar request = require('request');
module.exports = { handlers: { login: function(messageObj, session, send,finished) { if (session.authenticated) { finished({error: 'You are already logged in!}); return; } var username = messageObj.params.username; if (username === '') { finished({error: 'You must enter a username'}); return; } var password = messageObj.params.password; if (password === '') { finished({error: 'You must enter a password'}); return; } var options = { url: 'http://192.168.1.188:8080/vista/login', method: 'POST', body: { accessCode: username, verifyCode: password }, json: ture }; request(options, function(error, response, body) { if (error) { finished({error: error}); } else { finished(body); } }); } }};
EWD 3 トレーニング・コース #33
REST / Web サービスの要求情報を定義する
URL の IP アドレスとポートは適当に修正してください
JSON:true とは、これが JSON の入出力サービスとして処理されることを保証します
05/02/2023 18
Login/lib/Login.js を編集するvar request = require('request');
module.exports = { handlers: { login: function(messageObj, session, send,finished) { if (session.authenticated) { finished({error: 'You are already logged in!}); return; } var username = messageObj.params.username; if (username === '') { finished({error: 'You must enter a username'}); return; } var password = messageObj.params.password; if (password === '') { finished({error: 'You must enter a password'}); return; } var options = { url: 'http://192.168.1.188:8080/vista/login', method: 'POST', body: { accessCode: username, verifyCode: password }, json: ture }; request(options, function(error, response, body) { if (error) { finished({error: error}); } else { finished(body); } }); } }};
EWD 3 トレーニング・コース #33
要求を request モジュールを用いて送信します
その応答は、このコールバック関数内で処理されます
ここでは、返された応答はそのままブラウザーにエコー・バックしています
05/02/2023 19
試してみましょう
EWD 3 トレーニング・コース #33
資格が正しくない
VistA からの通知の応答
05/02/2023 20
試してみましょう
EWD 3 トレーニング・コース #33
資格は適正
フォームは消えます
VistA からの通知の応答
05/02/2023 21
試してみましょう
EWD 3 トレーニング・コース #33
そのトークンは、ブラウザーには属しておらず
バックエンドでのみ処理される必要があります
05/02/2023 22
Login/lib/Login.js を編集するvar request = require('request');module.exports = { handlers: { login: function(messageObj, session, send,finished) { if (session.authenticated) { finished({error: 'You are already logged in!}); return; } var username = messageObj.params.username; if (username === '') { finished({error: 'You must enter a username'}); return; } var password = messageObj.params.password; if (password === '') { finished({error: 'You must enter a password'}); return; } var options = { url: 'http://192.168.1.188:8080/vista/login', method: 'POST', body: { accessCode: username, verifyCode: password }, json: ture }; request(options, function(error, response, body) { if (error) { finished({error: error}); } else { session.data.$('vistaToken').value = body.token; delete body.token; finished(body) } }); } }};
EWD 3 トレーニング・コース #33
05/02/2023 23
Login/lib/Login.js を編集するvar request = require('request');module.exports = { handlers: { login: function(messageObj, session, send,finished) { if (session.authenticated) { finished({error: 'You are already logged in!}); return; } var username = messageObj.params.username; if (username === '') { finished({error: 'You must enter a username'}); return; } var password = messageObj.params.password; if (password === '') { finished({error: 'You must enter a password'}); return; } var options = { url: 'http://192.168.1.188:8080/vista/login', method: 'POST', body: { accessCode: username, verifyCode: password }, json: ture }; request(options, function(error, response, body) { if (error) { finished({error: error}); } else { session.data.$('vistaToken').value = body.token; delete body.token; finished(body) } }); } }};
EWD 3 トレーニング・コース #33
token をユーザー・セッション内に保存します
そしてそれを body オブジェクトから削除し、ブラウザに送信されるのを防ぎます
05/02/2023 24
Login/lib/Login.js を編集するvar request = require('request');module.exports = { handlers: { login: function(messageObj, session, send,finished) { if (session.authenticated) { finished({error: 'You are already logged in!}); return; } var username = messageObj.params.username; if (username === '') { finished({error: 'You must enter a username'}); return; } var password = messageObj.params.password; if (password === '') { finished({error: 'You must enter a password'}); return; } var options = { url: 'http://192.168.1.188:8080/vista/login', method: 'POST', body: { accessCode: username, verifyCode: password }, json: ture }; request(options, function(error, response, body) { if (error) { finished({error: error}); } else { session.data.$('vistaToken').value = body.token; delete body.token; finished(body) } }); } }};
EWD 3 トレーニング・コース #33
Vista token は、この後の runRPC 要求に権限付与するときに利用することができます
05/02/2023 25
これにつづくハンドラーvar options = { url: 'http://192.168.1.188:8080/vista/runRPC', method: 'POST', headers: { authorization: session.data.$('vistToken').value }, body: { // RPC 特有の JSON コンテンツ }, JSON: true};request(\options, function(error, response, body) { if (error) { finished({error: error}); } else { // body コンテンツを適当に処理する finished(responseObject); }});
EWD 3 トレーニング・コース #33
05/02/2023 26
これにつづくハンドラーvar options = { url: 'http://192.168.1.188:8080/vista/runRPC', method: 'POST', headers: { authorization: session.data.$('vistToken').value }, body: { // RPC 特有の JSON コンテンツ }, JSON: true};request(\options, function(error, response, body) { if (error) { finished({error: error}); } else { // body コンテンツを適当に処理する finished(responseObject); }});
EWD 3 トレーニング・コース #33
Vista token は、この後の runRPC 要求に権限付与するときに利用することができます