EWD 3トレーニングコース#33...

26
EWD 3 トトトトトト トトト #33 ewd-xpress トトトトトトトトトト REST Web トトトトトトトトトトト M/Gateway Developments Ltd. Rob Tweed ト : トトトトトトトトトトトトト ト トト

Transcript of EWD 3トレーニングコース#33...

Page 1: EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする

EWD 3トレーニング・コース  #33

ewd-xpress アプリケーションから

REST / Web サービスにアクセスするM/Gateway Developments Ltd.

Rob Tweed訳 : 日本ダイナシステム株式会社 嶋 芳成

Page 2: EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする

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サービスにアクセスする

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サービスにアクセスする

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サービスにアクセスする

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サービスにアクセスする

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サービスにアクセスする

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サービスにアクセスする

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サービスにアクセスする

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サービスにアクセスする

10

Node.js から HTTP クライアント・アクセス• バックエンドのメッセージ・ハンドラ関数が

HTTP クライアントとして働かなくてはなりません• Node.js はこのためのライブラリを提供して

います• しかしこれはとても低レベルのものなので、利用

するのはなかなか複雑です

2016/9/8 EWD 3 トレーニング・コース #33

Page 11: EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする

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サービスにアクセスする

12

request モジュールをインストールする• cd C:\ewd3• npm install request

2016/9/8 EWD 3 トレーニング・コース #33

Page 13: EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする

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サービスにアクセスする

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サービスにアクセスする

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サービスにアクセスする

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サービスにアクセスする

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サービスにアクセスする

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サービスにアクセスする

19

試してみましょう

2016/9/8 EWD 3 トレーニング・コース #33

資格が正しくない

VistA からの通知の応答

Page 20: EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする

20

試してみましょう

2016/9/8 EWD 3 トレーニング・コース #33

資格は適正

フォームは消えます

VistA からの通知の応答

Page 21: EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする

21

試してみましょう

2016/9/8 EWD 3 トレーニング・コース #33

そのトークンは、ブラウザーには属しておらず

バックエンドでのみ処理される必要があります

Page 22: EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする

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サービスにアクセスする

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サービスにアクセスする

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サービスにアクセスする

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サービスにアクセスする

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 要求に権限付与するときに利用することができます