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