EWD 3トレーニングコース#33...
-
Upload
kiyoshi-sawada -
Category
Software
-
view
97 -
download
0
Transcript of EWD 3トレーニングコース#33...
EWD 3トレーニング・コース #33
ewd-xpress アプリケーションから
REST / Web サービスにアクセスするM/Gateway Developments Ltd.
Rob Tweed訳 : 日本ダイナシステム株式会社 嶋 芳成
2
対話型 対 REST アプリケーション• 対話型アプリケーション• ewd-xpress バックエンドは、データベースやビ
ジネスロジックに直接アクセスします• 多分、従来のアプリケーション・ロジックを含みます
• REST• アプリケーション・ロジックは他のサーバーにあ
り、 REST / Web サービス呼び出し経由でアクセスします• ewd-xpress バックエンドは他のサーバーに対し
ては REST/HTTP 要求を送ります
2016/9/8 EWD 3 トレーニング・コース #33
3
ewd-xpress
ewd-qoper8 の
キュー
ewd-session Caché
カスタム・ワーカー・モ
ジュール
demo1.js
従来アプリのロジック関数グローバ
ル
Express
自給自足の対話型アプリケーション
2016/9/5 EWD 3 トレーニング・コース #8
ブラウザ
socket.io
socket.io
ewd-clientトーク
ン
4
ewd-xpress の REST バックエンド
2016/9/5 EWD 3 トレーニング・コース #8
HTTP クライアント ewd-xpress
ewd-qoper8 の
キュー
Caché
カスタム・ワーカー・モ
ジュール
demo1.js
従来アプリのロジック関数グローバ
ルHTTP
Express
5
ewd-qoper8-vistarpc のバックエンド
2016/9/5 EWD 3 トレーニング・コース #8
HTTP クライアント ewd-qoper8-vistarpc
ewd-qoper8 の
キュー
Caché
カスタム・ワーカー・モ
ジュール
vista-worker-module.js
従来アプリのロジック
インターフェース関数HTTP
Express
6
REST サービスにアクセスする ewd-xpress
2016/9/5 EWD 3 トレーニング・コース #8
ブラウザ ewd-xpress
socket.io
socket.io
ewd-clientトーク
ン
ewd-qoper8 のキュー
ewd-session Caché
カスタム・ワーカー・モ
ジュール
demo1.js
Express
別の REST /Web サービスHTTP
7
REST サービスにアクセスする ewd-xpress
2016/9/5 EWD 3 トレーニング・コース #8
ブラウザ ewd-xpress
socket.io
socket.io
ewd-clientトーク
ン
ewd-qoper8 のキュー
ewd-session Caché
カスタム・ワーカー・モ
ジュール
demo1.js
Express
ewd-xpress
ewd-qoper8 のキュー
Caché
カスタム・ワーカー・モ
ジュール
demo1.js
従来アプリのロジック
関数グローバル
Express
HTTP
8
ewd-qoper8-vistapc にアクセスする ewd-xpress
2016/9/5 EWD 3 トレーニング・コース #8
ブラウザ ewd-xpress
socket.io
socket.io
ewd-clientトーク
ン
ewd-qoper8 のキュー
ewd-session Caché
カスタム・ワーカー・モ
ジュール
demo1.js
Express
ewd-qoper8-vistarpc
ewd-qoper8 のキュー
Caché
カスタム・ワーカー・モ
ジュール
vista-worker-module.js
従来アプリのロジック
インターフェース関数
Express
HTTP
9
REST サービスにアクセスする ewd-xpress
2016/9/5 EWD 3 トレーニング・コース #8
ブラウザ ewd-xpress
socket.io
socket.io
ewd-clientトーク
ン
ewd-qoper8 のキュー
ewd-session Caché
カスタム・ワーカー・モ
ジュール
demo1.js
Express
別の REST /Web サービスHTTP
これを可能にするには、ここで何をすべてぎしょうか?
10
Node.js から HTTP クライアント・アクセス• バックエンドのメッセージ・ハンドラ関数が
HTTP クライアントとして働かなくてはなりません• Node.js はこのためのライブラリを提供して
います• しかしこれはとても低レベルのものなので、利用
するのはなかなか複雑です
2016/9/8 EWD 3 トレーニング・コース #33
11
Node.js から HTTP クライアント・アクセス• バックエンドのメッセージ・ハンドラ関数が
HTTP クライアントとして働かなくてはなりません• Node.js はこのためのライブラリを提供して
います• しかしこれはとても低レベルのものなので、利用
するのはなかなか複雑です
• Node.js ライブラリを再パッケージする、ビルド済みのモジュールを用いるのが、より良く、より容易です• request が多分最善で、最もよく使われています
2016/9/8 EWD 3 トレーニング・コース #33
12
request モジュールをインストールする• cd C:\ewd3• npm install request
2016/9/8 EWD 3 トレーニング・コース #33
13
REST サービスを用いてログインする• このトレーニング・コースの前の部分
で、 ewd-qoper8-vistarpc の REST API を見てきました• ewd-qoper8-vistarpc の /login という
REST 要求を用いるように demo1 アプリケーションを修正しましょう
2016/9/8 EWD 3 トレーニング・コース #33
14
Login サービスを編集する
• パート #30 で Login サービス・モジュールを作りました• Login メッセージに対するバックエンドの
メッセージ・ハンドラーは、下記のディレクトリにあります• Login/lib/Login.js
• 我々は、これを編集して、 ewd-qoper8-vistrpc の /login REST 要求を用いるようにできます
2016/9/8 EWD 3 トレーニング・コース #33
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); } }); } }};
2016/9/8 EWD 3 トレーニング・コース #33
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); } }); } }};
2016/9/8 EWD 3 トレーニング・コース #33
request モジュールを読み込む
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); } }); } }};
2016/9/8 EWD 3 トレーニング・コース #33
REST / Web サービスの要求情報を定義する
URL の IP アドレスとポートは適当に修正してください
JSON:true とは、これが JSON の入出力サービスとして処理されることを保証します
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); } }); } }};
2016/9/8 EWD 3 トレーニング・コース #33
要求を request モジュールを用いて送信します
その応答は、このコールバック関数内で処理されます
ここでは、返された応答はそのままブラウザーにエコー・バックしています
19
試してみましょう
2016/9/8 EWD 3 トレーニング・コース #33
資格が正しくない
VistA からの通知の応答
20
試してみましょう
2016/9/8 EWD 3 トレーニング・コース #33
資格は適正
フォームは消えます
VistA からの通知の応答
21
試してみましょう
2016/9/8 EWD 3 トレーニング・コース #33
そのトークンは、ブラウザーには属しておらず
バックエンドでのみ処理される必要があります
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) } }); } }};
2016/9/8 EWD 3 トレーニング・コース #33
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) } }); } }};
2016/9/8 EWD 3 トレーニング・コース #33
token をユーザー・セッション内に保存します
そしてそれを body オブジェクトから削除し、ブラウザに送信されるのを防ぎます
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) } }); } }};
2016/9/8 EWD 3 トレーニング・コース #33
Vista token は、この後の runRPC 要求に権限付与するときに利用することができます
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); }});
2016/9/8 EWD 3 トレーニング・コース #33
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); }});
2016/9/8 EWD 3 トレーニング・コース #33
Vista token は、この後の runRPC 要求に権限付与するときに利用することができます