SlideShare a Scribd company logo
1 of 37
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8-vistarpc:
Exposing VistA's RPCs as
REST services
Rob Tweed
Director, M/Gateway Developments Ltd
Twitter: @rtweed
Copyright © 2016 M/Gateway Developments Ltd
VistA?
• The US Dept of Veterans' Affairs (VA)
Electronic Healthcare Register (EHR)
• Legacy Mumps application
– Huge application
– Highly functional and well-regarded
– But: Millions of lines of terse Mumps code
– But: Old-fashioned user interfaces
• Roll & scroll / "green screen" / "dumb terminal"
• Delphi (CPRS)
Copyright © 2016 M/Gateway Developments Ltd
VistA Modernisation using EWD 3
• EWD 3 offers great opportunities for
modernising VistA
– New user interfaces
• Browser-based
• Mobile (using React Native)
• Electron (desktop)
– Exposing VistA as a set of REST-ful services?
Copyright © 2016 M/Gateway Developments Ltd
Key problems
• VistA was designed as a stateful
application:
– Directly-connected terminal providing the user
interface
– Mumps/Caché process maintains state via
"local variables" to which the user's process
has continual, direct access
Copyright © 2016 M/Gateway Developments Ltd
Key problems
• EWD 3 is stateless
– Executes application code in discrete,
independent chunks
– Different physical Mumps/Caché processes
may handle each successive request from
browser
– EWD 3 provides its own state maintenance
mechanism
• But this is nothing to do with Mumps local variables
Copyright © 2016 M/Gateway Developments Ltd
VistA RPCs
• VistA provides a mechanism for defining chunks
of pre-defined behaviour
– Known as RPCs
– Designed for use with CPRS (Delphi)
• Many RPCs already exist
– Many are well known and understood by VistA/CPRS
developers
– However, they vary in quality and level of
conformance to the expected pattern(s) for RPCs
Copyright © 2016 M/Gateway Developments Ltd
Alternatives to RPCs
• FileMan APIs
– FileMan is VistA's integrated data dictionary
– Access to VistA's data should always be via
FileMan
• RPCs are supposed to do this
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8-vistarpc
• A pre-built EWD 3-based platform for
exposing VistA's RPCs as REST services
– Provides a solution for accessing VistA's
stateful environment as a set of stateless
requests
• Performs a trick whereby the Mumps local
variables (aka "symbol table") is maintained in an
EWD Session
– JSON input to RPCs
– JSON output from RPCs
Copyright © 2016 M/Gateway Developments Ltd
Installing ewd-qoper8-vistarpc
cd ewd3
npm install express body-parser
npm install ewd-qoper8 ewd-qoper8-express ewd-qoper8-cache
npm install ewd-session ewd-qoper8-vistarpc
Note: check first in C:ewd3node_modules
If you've been running all the examples in previous parts of this course,
You'll already have installed most of these modules
You may only need to do this:
npm install ewd-qoper8-vistarpc
Copyright © 2016 M/Gateway Developments Ltd
Installing ewd-qoper8-vistarpc
Copy:
C:ewd3node_modulesewd-qoper8-vistarpcexampleewd-vista-express.js
To:
C:ewd3ewd-vista-express.js
Copyright © 2016 M/Gateway Developments Ltd
Installing ewd-qoper8-vistarpc
Copy:
C:ewd3node_modulesewd-qoper8-vistarpcexamplevista-worker-module.js
To:
C:ewd3node_modulesvista-worker-module.js
Copyright © 2016 M/Gateway Developments Ltd
Installing ewd-qoper8-vistarpc
Install the Mumps code that maintains the Mumps symbol table for VistA
- Start a Cache Terminal process
w $system.OBJ.Load("C:ewd3node_modulesewd-sessionmumpsewdSymbolTable.xml","ck")
Install the Mumps wrapper function that interfaces VistA's RPCs
- In the same Cache Terminal process
w $system.OBJ.Load("C:ewd3node_modulesewd-qoper8-vistarpcmumpsewdVistARPC.xml","ck")
Copyright © 2016 M/Gateway Developments Ltd
Configure ewd-qoper8-vistarpc
If you want it to listen on a port other than 8080, edit
C:ewd3ewd-vista-express.js
Line 69:
var port = 8080;
Copyright © 2016 M/Gateway Developments Ltd
Configure ewd-qoper8-vistarpc
If you want more than 1 ewd-qoper8 worker process, edit
C:ewd3ewd-vista-express.js
Add after this line (line 70):
app.listen(port);
q.on('start', function() {
this.setWorkerPoolSize(3); // 3 workers or change to however many you need
});
Copyright © 2016 M/Gateway Developments Ltd
Configure ewd-qoper8-vistarpc
If you want it to use a URL prefix other than /vista, edit
C:ewd3ewd-vista-express.js
Line 61:
app.use('/vista', qx.router());
Copyright © 2016 M/Gateway Developments Ltd
Configure ewd-qoper8-vistarpc
Check:
C:ewd3node_modulesvista-worker-module.js
The Cache configuration is defined at about line 58:
var connectCacheTo = require('ewd-qoper8-cache');
var params = {
namespace: 'VISTA'
};
Change the namespace and path if required, eg
var params = {
path: 'C:InterSystemsCache2015-2mgr',
namespace: 'GOLD'
};
Copyright © 2016 M/Gateway Developments Ltd
Configure ewd-qoper8-vistarpc
Some systems may use a different username & password for Caché also
Defaults are _SYSTEM and SYS respectively. If yours are different, edit
appropriately, eg:
var params = {
path: 'C:InterSystemsCache2015-2mgr',
namespace: 'GOLD',
username: 'CacheUser',
password: 'secret1234'
};
Copyright © 2016 M/Gateway Developments Ltd
Start ewd-qoper8-vistarpc
cd ewd3
node ewd-vista-express
Worker Bootstrap Module file written to node_modules/ewd-qoper8-worker.js
========================================================
ewd-qoper8 is up and running. Max worker pool size: 1
========================================================
ewd-qoper8-vistarpc is now running and listening on port 8080
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8-vistarpc APIs
• There are really only two:
– login
• Authenticates the user via his/her Access Code &
Verify Code
• Returns a security / EWD Session token
– runRPC
• Executes the specified RPC
• Request must be authenticated using a valid token
Copyright © 2016 M/Gateway Developments Ltd
Logging In
• For testing, use a REST client, eg:
– Postman
– Chrome Advanced REST Client
Copyright © 2016 M/Gateway Developments Ltd
Logging In
Enter the URL: /vista/login
Copyright © 2016 M/Gateway Developments Ltd
Logging In
Enter the URL: /vista/login
Must be a POST
Copyright © 2016 M/Gateway Developments Ltd
Logging In
Enter the URL: /vista/login
Must be a POST
Note the content-type
Copyright © 2016 M/Gateway Developments Ltd
Logging In
Enter the URL: /vista/login
Must be a POST
Enter the Access Code &
Verify Code as a JSON payload
Note the content-type
Copyright © 2016 M/Gateway Developments Ltd
Logging In
Enter the URL: /vista/login
Must be a POST
Enter the Access Code &
Verify Code as a JSON payload
Note the content-type
Success!
Copyright © 2016 M/Gateway Developments Ltd
Logging In
Copy this token:
Copyright © 2016 M/Gateway Developments Ltd
runRPC
• Now that you're logged in, you can
invoked any RPC that your Access Code
is allowed to use. The URL is:
POST http://192.168.1.100:8080/vista/runRPC/[RPC Name]
For example
POST http://192.168.1.100:8080/vista/runRPC/DDR GETS ENTRY DATA
Note you may need to URL-escape the URL:
POST http://192.168.1.100:8080/vista/runRPC/DDR%20GETS%20ENTRY%20DATA
Copyright © 2016 M/Gateway Developments Ltd
runRPC
• runRPC POST requests must be
authenticated using the Session Token
returned by a successful /login request
• The token value is used in the
Authorization header
Copyright © 2016 M/Gateway Developments Ltd
Try it
Enter the escaped URL: /vista/runRPC/…
Copyright © 2016 M/Gateway Developments Ltd
Try it
Enter the escaped URL: /vista/runRPC/…
Must be a POST
Copyright © 2016 M/Gateway Developments Ltd
Try it
Enter the escaped URL: /vista/runRPC/…
Valid token used as value for
Authorization header
Must be a POST
Copyright © 2016 M/Gateway Developments Ltd
Try it
Enter the escaped URL: /vista/runRPC/…
Valid token used as value for
Authorization header
JSON payload appropriate
for the content needed for
the specified RPC
Must be a POST
Copyright © 2016 M/Gateway Developments Ltd
Try it
Enter the escaped URL: /vista/runRPC/…
Valid token used as value for
Authorization header
JSON payload appropriate
for the content needed for
the specified RPC
Must be a POST
Successful response
JSON content depends on
RPC
Copyright © 2016 M/Gateway Developments Ltd
Symbol Table Maintenance
• After successful /login, the Mumps symbol
table is saved to the user's Session
– Uses a special undocumented Caché
function:
• $zu(160)
• Very high-speed symbol-table copy to/from a
global (in this case the user's Session global)
– The user's DUZ etc is therefore captured
Copyright © 2016 M/Gateway Developments Ltd
Symbol Table Maintenance
• When a runRPC request is received:
– Token in Authorization header is checked
– If valid, it now knows the user's Session
– Symbol table is restored into Caché process
• On completion of runRPC, after response
returned to client:
– Symbol table is saved back to user's Session
Copyright © 2016 M/Gateway Developments Ltd
Symbol Table Maintenance
• RPC is therefore invoked in user's correct
run-time MUMPS context
– DUZ etc is correct for each RPC invoked by a
user
• Even though RPCs are being invoked
statelessly by potentially different Caché
processes each time, they appear to be
running in a stateful environment
Copyright © 2016 M/Gateway Developments Ltd
Ongoing Development
• Some functionality isn't necessarily
correct, eg:
– Handling contexts
• ewdVistARPC Mumps routine needs peer
review and discussion
– eg Sam Habiel and Nikolay Topalov already
discussing its finer details
– Use the EWD Google group for such
discussions

More Related Content

What's hot

QEWD.js, JSON Web Tokens & MicroServices
QEWD.js, JSON Web Tokens & MicroServicesQEWD.js, JSON Web Tokens & MicroServices
QEWD.js, JSON Web Tokens & MicroServicesRob Tweed
 
EWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 42: The QEWD Docker ApplianceEWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 42: The QEWD Docker ApplianceRob Tweed
 
EWD 3 Training Course Part 8: Anatomy of the QEWD Messaging Cycle
EWD 3 Training Course Part 8: Anatomy of the QEWD Messaging CycleEWD 3 Training Course Part 8: Anatomy of the QEWD Messaging Cycle
EWD 3 Training Course Part 8: Anatomy of the QEWD Messaging CycleRob Tweed
 
EWD 3 Training Course Part 33: Configuring QEWD to use CORS
EWD 3 Training Course Part 33: Configuring QEWD to use CORSEWD 3 Training Course Part 33: Configuring QEWD to use CORS
EWD 3 Training Course Part 33: Configuring QEWD to use CORSRob Tweed
 
EWD 3 Training Course Part 2: EWD 3 Overview
EWD 3 Training Course Part 2: EWD 3 OverviewEWD 3 Training Course Part 2: EWD 3 Overview
EWD 3 Training Course Part 2: EWD 3 OverviewRob Tweed
 
EWD 3 Training Course Part 19: The cache.node APIs
EWD 3 Training Course Part 19: The cache.node APIsEWD 3 Training Course Part 19: The cache.node APIs
EWD 3 Training Course Part 19: The cache.node APIsRob Tweed
 
EWD 3 Training Course Part 31: Using QEWD for Web and REST Services
EWD 3 Training Course Part 31: Using QEWD for Web and REST ServicesEWD 3 Training Course Part 31: Using QEWD for Web and REST Services
EWD 3 Training Course Part 31: Using QEWD for Web and REST ServicesRob Tweed
 
EWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 34: QEWD Resilient ModeEWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 34: QEWD Resilient ModeRob Tweed
 
EWD 3 Training Course Part 3: Summary of EWD 3 Modules
EWD 3 Training Course Part 3: Summary of EWD 3 ModulesEWD 3 Training Course Part 3: Summary of EWD 3 Modules
EWD 3 Training Course Part 3: Summary of EWD 3 ModulesRob Tweed
 
Data Persistence as a Language Feature
Data Persistence as a Language FeatureData Persistence as a Language Feature
Data Persistence as a Language FeatureRob Tweed
 
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...Rob Tweed
 
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWD
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWDEWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWD
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWDRob Tweed
 
EWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5b: First Steps in Building a QEWD ApplicationEWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5b: First Steps in Building a QEWD ApplicationRob Tweed
 
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWD
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWDEWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWD
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWDRob Tweed
 
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...Rob Tweed
 
EWD 3 Training Course Part 11: Handling Errors in QEWD
EWD 3 Training Course Part 11: Handling Errors in QEWDEWD 3 Training Course Part 11: Handling Errors in QEWD
EWD 3 Training Course Part 11: Handling Errors in QEWDRob Tweed
 
EWD 3 Training Course Part 27: The QEWD Session
EWD 3 Training Course Part 27: The QEWD SessionEWD 3 Training Course Part 27: The QEWD Session
EWD 3 Training Course Part 27: The QEWD SessionRob Tweed
 
EWD.js: The Future Starts Here
EWD.js: The Future Starts HereEWD.js: The Future Starts Here
EWD.js: The Future Starts HereRob Tweed
 
EWD 3 Training Course Part 5a: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5a: First Steps in Building a QEWD ApplicationEWD 3 Training Course Part 5a: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5a: First Steps in Building a QEWD ApplicationRob Tweed
 

What's hot (20)

QEWD.js, JSON Web Tokens & MicroServices
QEWD.js, JSON Web Tokens & MicroServicesQEWD.js, JSON Web Tokens & MicroServices
QEWD.js, JSON Web Tokens & MicroServices
 
EWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 42: The QEWD Docker ApplianceEWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 42: The QEWD Docker Appliance
 
EWD 3 Training Course Part 8: Anatomy of the QEWD Messaging Cycle
EWD 3 Training Course Part 8: Anatomy of the QEWD Messaging CycleEWD 3 Training Course Part 8: Anatomy of the QEWD Messaging Cycle
EWD 3 Training Course Part 8: Anatomy of the QEWD Messaging Cycle
 
EWD 3 Training Course Part 33: Configuring QEWD to use CORS
EWD 3 Training Course Part 33: Configuring QEWD to use CORSEWD 3 Training Course Part 33: Configuring QEWD to use CORS
EWD 3 Training Course Part 33: Configuring QEWD to use CORS
 
EWD 3 Training Course Part 2: EWD 3 Overview
EWD 3 Training Course Part 2: EWD 3 OverviewEWD 3 Training Course Part 2: EWD 3 Overview
EWD 3 Training Course Part 2: EWD 3 Overview
 
EWD 3 Training Course Part 19: The cache.node APIs
EWD 3 Training Course Part 19: The cache.node APIsEWD 3 Training Course Part 19: The cache.node APIs
EWD 3 Training Course Part 19: The cache.node APIs
 
EWD 3 Training Course Part 31: Using QEWD for Web and REST Services
EWD 3 Training Course Part 31: Using QEWD for Web and REST ServicesEWD 3 Training Course Part 31: Using QEWD for Web and REST Services
EWD 3 Training Course Part 31: Using QEWD for Web and REST Services
 
EWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 34: QEWD Resilient ModeEWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 34: QEWD Resilient Mode
 
EWD 3 Training Course Part 3: Summary of EWD 3 Modules
EWD 3 Training Course Part 3: Summary of EWD 3 ModulesEWD 3 Training Course Part 3: Summary of EWD 3 Modules
EWD 3 Training Course Part 3: Summary of EWD 3 Modules
 
QEWD Update
QEWD UpdateQEWD Update
QEWD Update
 
Data Persistence as a Language Feature
Data Persistence as a Language FeatureData Persistence as a Language Feature
Data Persistence as a Language Feature
 
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
 
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWD
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWDEWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWD
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWD
 
EWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5b: First Steps in Building a QEWD ApplicationEWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
 
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWD
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWDEWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWD
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWD
 
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
 
EWD 3 Training Course Part 11: Handling Errors in QEWD
EWD 3 Training Course Part 11: Handling Errors in QEWDEWD 3 Training Course Part 11: Handling Errors in QEWD
EWD 3 Training Course Part 11: Handling Errors in QEWD
 
EWD 3 Training Course Part 27: The QEWD Session
EWD 3 Training Course Part 27: The QEWD SessionEWD 3 Training Course Part 27: The QEWD Session
EWD 3 Training Course Part 27: The QEWD Session
 
EWD.js: The Future Starts Here
EWD.js: The Future Starts HereEWD.js: The Future Starts Here
EWD.js: The Future Starts Here
 
EWD 3 Training Course Part 5a: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5a: First Steps in Building a QEWD ApplicationEWD 3 Training Course Part 5a: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5a: First Steps in Building a QEWD Application
 

Similar to ewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Services

Jax WS JAX RS and Java Web Apps with WSO2 Platform
Jax WS JAX RS and Java Web Apps with WSO2 PlatformJax WS JAX RS and Java Web Apps with WSO2 Platform
Jax WS JAX RS and Java Web Apps with WSO2 PlatformWSO2
 
Hands on with CoAP and Californium
Hands on with CoAP and CaliforniumHands on with CoAP and Californium
Hands on with CoAP and CaliforniumJulien Vermillard
 
ITCamp 2011 - Florin Cardasim - Duplex Communications with WCF and Azure
ITCamp 2011 - Florin Cardasim - Duplex Communications with WCF and AzureITCamp 2011 - Florin Cardasim - Duplex Communications with WCF and Azure
ITCamp 2011 - Florin Cardasim - Duplex Communications with WCF and AzureFlorin Cardasim
 
Integrating with SAP FIX and HL7
Integrating with SAP FIX and HL7Integrating with SAP FIX and HL7
Integrating with SAP FIX and HL7WSO2
 
Working with PowerVC via its REST APIs
Working with PowerVC via its REST APIsWorking with PowerVC via its REST APIs
Working with PowerVC via its REST APIsJoe Cropper
 
AWS CloudFormation Automation, TrafficScript, and Serverless architecture wit...
AWS CloudFormation Automation, TrafficScript, and Serverless architecture wit...AWS CloudFormation Automation, TrafficScript, and Serverless architecture wit...
AWS CloudFormation Automation, TrafficScript, and Serverless architecture wit...PolarSeven Pty Ltd
 
XSEDE14 SciGaP-Apache Airavata Tutorial
XSEDE14 SciGaP-Apache Airavata TutorialXSEDE14 SciGaP-Apache Airavata Tutorial
XSEDE14 SciGaP-Apache Airavata Tutorialmarpierc
 
Programmable Data Plane at Terabit Speeds
Programmable Data Plane at Terabit SpeedsProgrammable Data Plane at Terabit Speeds
Programmable Data Plane at Terabit SpeedsBarefoot Networks
 
Programmable data plane at terabit speeds
Programmable data plane at terabit speedsProgrammable data plane at terabit speeds
Programmable data plane at terabit speedsBarefoot Networks
 
Leverage Kafka to build a stream processing platform
Leverage Kafka to build a stream processing platformLeverage Kafka to build a stream processing platform
Leverage Kafka to build a stream processing platformconfluent
 
FIWARE Global Summit - Real-time Media Stream Processing Using Kurento
FIWARE Global Summit - Real-time Media Stream Processing Using KurentoFIWARE Global Summit - Real-time Media Stream Processing Using Kurento
FIWARE Global Summit - Real-time Media Stream Processing Using KurentoFIWARE
 
Data Summer Conf 2018, “Building unified Batch and Stream processing pipeline...
Data Summer Conf 2018, “Building unified Batch and Stream processing pipeline...Data Summer Conf 2018, “Building unified Batch and Stream processing pipeline...
Data Summer Conf 2018, “Building unified Batch and Stream processing pipeline...Provectus
 
The next step from Microsoft - Vnext (Srdjan Poznic)
The next step from Microsoft - Vnext (Srdjan Poznic)The next step from Microsoft - Vnext (Srdjan Poznic)
The next step from Microsoft - Vnext (Srdjan Poznic)Geekstone
 
Using Istio to Secure & Monitor Your Services
Using Istio to Secure & Monitor Your ServicesUsing Istio to Secure & Monitor Your Services
Using Istio to Secure & Monitor Your ServicesAlcide
 
DPDK Summit 2015 - RIFT.io - Tim Mortsolf
DPDK Summit 2015 - RIFT.io - Tim MortsolfDPDK Summit 2015 - RIFT.io - Tim Mortsolf
DPDK Summit 2015 - RIFT.io - Tim MortsolfJim St. Leger
 
MERN SRTACK WEB DEVELOPMENT NODE JS EXPRESS
MERN SRTACK WEB DEVELOPMENT NODE JS EXPRESSMERN SRTACK WEB DEVELOPMENT NODE JS EXPRESS
MERN SRTACK WEB DEVELOPMENT NODE JS EXPRESSannalakshmi35
 
Tuning and development with SIP Servlets on Mobicents
Tuning and development with SIP Servlets on MobicentsTuning and development with SIP Servlets on Mobicents
Tuning and development with SIP Servlets on MobicentsJean Deruelle
 
IoT Service Bus - High availability with Internet of Things (IoT)/ API Rest/ ...
IoT Service Bus - High availability with Internet of Things (IoT)/ API Rest/ ...IoT Service Bus - High availability with Internet of Things (IoT)/ API Rest/ ...
IoT Service Bus - High availability with Internet of Things (IoT)/ API Rest/ ...Alexandre Brandão Lustosa
 
HTTP/2 - How it's changing web performance
HTTP/2 - How it's changing web performanceHTTP/2 - How it's changing web performance
HTTP/2 - How it's changing web performanceMateus Prado
 

Similar to ewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Services (20)

Jax WS JAX RS and Java Web Apps with WSO2 Platform
Jax WS JAX RS and Java Web Apps with WSO2 PlatformJax WS JAX RS and Java Web Apps with WSO2 Platform
Jax WS JAX RS and Java Web Apps with WSO2 Platform
 
Hands on with CoAP and Californium
Hands on with CoAP and CaliforniumHands on with CoAP and Californium
Hands on with CoAP and Californium
 
ITCamp 2011 - Florin Cardasim - Duplex Communications with WCF and Azure
ITCamp 2011 - Florin Cardasim - Duplex Communications with WCF and AzureITCamp 2011 - Florin Cardasim - Duplex Communications with WCF and Azure
ITCamp 2011 - Florin Cardasim - Duplex Communications with WCF and Azure
 
Integrating with SAP FIX and HL7
Integrating with SAP FIX and HL7Integrating with SAP FIX and HL7
Integrating with SAP FIX and HL7
 
Working with PowerVC via its REST APIs
Working with PowerVC via its REST APIsWorking with PowerVC via its REST APIs
Working with PowerVC via its REST APIs
 
AWS CloudFormation Automation, TrafficScript, and Serverless architecture wit...
AWS CloudFormation Automation, TrafficScript, and Serverless architecture wit...AWS CloudFormation Automation, TrafficScript, and Serverless architecture wit...
AWS CloudFormation Automation, TrafficScript, and Serverless architecture wit...
 
23003468463PPT.pptx
23003468463PPT.pptx23003468463PPT.pptx
23003468463PPT.pptx
 
XSEDE14 SciGaP-Apache Airavata Tutorial
XSEDE14 SciGaP-Apache Airavata TutorialXSEDE14 SciGaP-Apache Airavata Tutorial
XSEDE14 SciGaP-Apache Airavata Tutorial
 
Programmable Data Plane at Terabit Speeds
Programmable Data Plane at Terabit SpeedsProgrammable Data Plane at Terabit Speeds
Programmable Data Plane at Terabit Speeds
 
Programmable data plane at terabit speeds
Programmable data plane at terabit speedsProgrammable data plane at terabit speeds
Programmable data plane at terabit speeds
 
Leverage Kafka to build a stream processing platform
Leverage Kafka to build a stream processing platformLeverage Kafka to build a stream processing platform
Leverage Kafka to build a stream processing platform
 
FIWARE Global Summit - Real-time Media Stream Processing Using Kurento
FIWARE Global Summit - Real-time Media Stream Processing Using KurentoFIWARE Global Summit - Real-time Media Stream Processing Using Kurento
FIWARE Global Summit - Real-time Media Stream Processing Using Kurento
 
Data Summer Conf 2018, “Building unified Batch and Stream processing pipeline...
Data Summer Conf 2018, “Building unified Batch and Stream processing pipeline...Data Summer Conf 2018, “Building unified Batch and Stream processing pipeline...
Data Summer Conf 2018, “Building unified Batch and Stream processing pipeline...
 
The next step from Microsoft - Vnext (Srdjan Poznic)
The next step from Microsoft - Vnext (Srdjan Poznic)The next step from Microsoft - Vnext (Srdjan Poznic)
The next step from Microsoft - Vnext (Srdjan Poznic)
 
Using Istio to Secure & Monitor Your Services
Using Istio to Secure & Monitor Your ServicesUsing Istio to Secure & Monitor Your Services
Using Istio to Secure & Monitor Your Services
 
DPDK Summit 2015 - RIFT.io - Tim Mortsolf
DPDK Summit 2015 - RIFT.io - Tim MortsolfDPDK Summit 2015 - RIFT.io - Tim Mortsolf
DPDK Summit 2015 - RIFT.io - Tim Mortsolf
 
MERN SRTACK WEB DEVELOPMENT NODE JS EXPRESS
MERN SRTACK WEB DEVELOPMENT NODE JS EXPRESSMERN SRTACK WEB DEVELOPMENT NODE JS EXPRESS
MERN SRTACK WEB DEVELOPMENT NODE JS EXPRESS
 
Tuning and development with SIP Servlets on Mobicents
Tuning and development with SIP Servlets on MobicentsTuning and development with SIP Servlets on Mobicents
Tuning and development with SIP Servlets on Mobicents
 
IoT Service Bus - High availability with Internet of Things (IoT)/ API Rest/ ...
IoT Service Bus - High availability with Internet of Things (IoT)/ API Rest/ ...IoT Service Bus - High availability with Internet of Things (IoT)/ API Rest/ ...
IoT Service Bus - High availability with Internet of Things (IoT)/ API Rest/ ...
 
HTTP/2 - How it's changing web performance
HTTP/2 - How it's changing web performanceHTTP/2 - How it's changing web performance
HTTP/2 - How it's changing web performance
 

More from Rob Tweed

EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST ServicesEWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST ServicesRob Tweed
 
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5Rob Tweed
 
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4Rob Tweed
 
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3Rob Tweed
 
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2Rob Tweed
 
EWD 3 Training Course Part 35: QEWD Session Locking
EWD 3 Training Course Part 35: QEWD Session LockingEWD 3 Training Course Part 35: QEWD Session Locking
EWD 3 Training Course Part 35: QEWD Session LockingRob Tweed
 
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPS
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPSEWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPS
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPSRob Tweed
 
EWD 3 Training Course Part 29: Running QEWD as a Service
EWD 3 Training Course Part 29: Running QEWD as a ServiceEWD 3 Training Course Part 29: Running QEWD as a Service
EWD 3 Training Course Part 29: Running QEWD as a ServiceRob Tweed
 
EWD 3 Training Course Part 26: Event-driven Indexing
EWD 3 Training Course Part 26: Event-driven IndexingEWD 3 Training Course Part 26: Event-driven Indexing
EWD 3 Training Course Part 26: Event-driven IndexingRob Tweed
 
EWD 3 Training Course Part 25: Document Database Capabilities
EWD 3 Training Course Part 25: Document Database CapabilitiesEWD 3 Training Course Part 25: Document Database Capabilities
EWD 3 Training Course Part 25: Document Database CapabilitiesRob Tweed
 
EWD 3 Training Course Part 24: Traversing a Document's Leaf Nodes
EWD 3 Training Course Part 24: Traversing a Document's Leaf NodesEWD 3 Training Course Part 24: Traversing a Document's Leaf Nodes
EWD 3 Training Course Part 24: Traversing a Document's Leaf NodesRob Tweed
 
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode Objects
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode ObjectsEWD 3 Training Course Part 23: Traversing a Range using DocumentNode Objects
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode ObjectsRob Tweed
 

More from Rob Tweed (12)

EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST ServicesEWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
 
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
 
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
 
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
 
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
 
EWD 3 Training Course Part 35: QEWD Session Locking
EWD 3 Training Course Part 35: QEWD Session LockingEWD 3 Training Course Part 35: QEWD Session Locking
EWD 3 Training Course Part 35: QEWD Session Locking
 
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPS
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPSEWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPS
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPS
 
EWD 3 Training Course Part 29: Running QEWD as a Service
EWD 3 Training Course Part 29: Running QEWD as a ServiceEWD 3 Training Course Part 29: Running QEWD as a Service
EWD 3 Training Course Part 29: Running QEWD as a Service
 
EWD 3 Training Course Part 26: Event-driven Indexing
EWD 3 Training Course Part 26: Event-driven IndexingEWD 3 Training Course Part 26: Event-driven Indexing
EWD 3 Training Course Part 26: Event-driven Indexing
 
EWD 3 Training Course Part 25: Document Database Capabilities
EWD 3 Training Course Part 25: Document Database CapabilitiesEWD 3 Training Course Part 25: Document Database Capabilities
EWD 3 Training Course Part 25: Document Database Capabilities
 
EWD 3 Training Course Part 24: Traversing a Document's Leaf Nodes
EWD 3 Training Course Part 24: Traversing a Document's Leaf NodesEWD 3 Training Course Part 24: Traversing a Document's Leaf Nodes
EWD 3 Training Course Part 24: Traversing a Document's Leaf Nodes
 
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode Objects
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode ObjectsEWD 3 Training Course Part 23: Traversing a Range using DocumentNode Objects
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode Objects
 

Recently uploaded

HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...OnePlan Solutions
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideChristina Lin
 
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio, Inc.
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...aditisharan08
 
Engage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyEngage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyFrank van der Linden
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWave PLM
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...kellynguyen01
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
XpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software SolutionsXpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software SolutionsMehedi Hasan Shohan
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...Christina Lin
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about usDynamic Netsoft
 

Recently uploaded (20)

HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
 
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...
 
Engage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyEngage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The Ugly
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need It
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
XpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software SolutionsXpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software Solutions
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about us
 

ewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Services

  • 1. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8-vistarpc: Exposing VistA's RPCs as REST services Rob Tweed Director, M/Gateway Developments Ltd Twitter: @rtweed
  • 2. Copyright © 2016 M/Gateway Developments Ltd VistA? • The US Dept of Veterans' Affairs (VA) Electronic Healthcare Register (EHR) • Legacy Mumps application – Huge application – Highly functional and well-regarded – But: Millions of lines of terse Mumps code – But: Old-fashioned user interfaces • Roll & scroll / "green screen" / "dumb terminal" • Delphi (CPRS)
  • 3. Copyright © 2016 M/Gateway Developments Ltd VistA Modernisation using EWD 3 • EWD 3 offers great opportunities for modernising VistA – New user interfaces • Browser-based • Mobile (using React Native) • Electron (desktop) – Exposing VistA as a set of REST-ful services?
  • 4. Copyright © 2016 M/Gateway Developments Ltd Key problems • VistA was designed as a stateful application: – Directly-connected terminal providing the user interface – Mumps/Caché process maintains state via "local variables" to which the user's process has continual, direct access
  • 5. Copyright © 2016 M/Gateway Developments Ltd Key problems • EWD 3 is stateless – Executes application code in discrete, independent chunks – Different physical Mumps/Caché processes may handle each successive request from browser – EWD 3 provides its own state maintenance mechanism • But this is nothing to do with Mumps local variables
  • 6. Copyright © 2016 M/Gateway Developments Ltd VistA RPCs • VistA provides a mechanism for defining chunks of pre-defined behaviour – Known as RPCs – Designed for use with CPRS (Delphi) • Many RPCs already exist – Many are well known and understood by VistA/CPRS developers – However, they vary in quality and level of conformance to the expected pattern(s) for RPCs
  • 7. Copyright © 2016 M/Gateway Developments Ltd Alternatives to RPCs • FileMan APIs – FileMan is VistA's integrated data dictionary – Access to VistA's data should always be via FileMan • RPCs are supposed to do this
  • 8. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8-vistarpc • A pre-built EWD 3-based platform for exposing VistA's RPCs as REST services – Provides a solution for accessing VistA's stateful environment as a set of stateless requests • Performs a trick whereby the Mumps local variables (aka "symbol table") is maintained in an EWD Session – JSON input to RPCs – JSON output from RPCs
  • 9. Copyright © 2016 M/Gateway Developments Ltd Installing ewd-qoper8-vistarpc cd ewd3 npm install express body-parser npm install ewd-qoper8 ewd-qoper8-express ewd-qoper8-cache npm install ewd-session ewd-qoper8-vistarpc Note: check first in C:ewd3node_modules If you've been running all the examples in previous parts of this course, You'll already have installed most of these modules You may only need to do this: npm install ewd-qoper8-vistarpc
  • 10. Copyright © 2016 M/Gateway Developments Ltd Installing ewd-qoper8-vistarpc Copy: C:ewd3node_modulesewd-qoper8-vistarpcexampleewd-vista-express.js To: C:ewd3ewd-vista-express.js
  • 11. Copyright © 2016 M/Gateway Developments Ltd Installing ewd-qoper8-vistarpc Copy: C:ewd3node_modulesewd-qoper8-vistarpcexamplevista-worker-module.js To: C:ewd3node_modulesvista-worker-module.js
  • 12. Copyright © 2016 M/Gateway Developments Ltd Installing ewd-qoper8-vistarpc Install the Mumps code that maintains the Mumps symbol table for VistA - Start a Cache Terminal process w $system.OBJ.Load("C:ewd3node_modulesewd-sessionmumpsewdSymbolTable.xml","ck") Install the Mumps wrapper function that interfaces VistA's RPCs - In the same Cache Terminal process w $system.OBJ.Load("C:ewd3node_modulesewd-qoper8-vistarpcmumpsewdVistARPC.xml","ck")
  • 13. Copyright © 2016 M/Gateway Developments Ltd Configure ewd-qoper8-vistarpc If you want it to listen on a port other than 8080, edit C:ewd3ewd-vista-express.js Line 69: var port = 8080;
  • 14. Copyright © 2016 M/Gateway Developments Ltd Configure ewd-qoper8-vistarpc If you want more than 1 ewd-qoper8 worker process, edit C:ewd3ewd-vista-express.js Add after this line (line 70): app.listen(port); q.on('start', function() { this.setWorkerPoolSize(3); // 3 workers or change to however many you need });
  • 15. Copyright © 2016 M/Gateway Developments Ltd Configure ewd-qoper8-vistarpc If you want it to use a URL prefix other than /vista, edit C:ewd3ewd-vista-express.js Line 61: app.use('/vista', qx.router());
  • 16. Copyright © 2016 M/Gateway Developments Ltd Configure ewd-qoper8-vistarpc Check: C:ewd3node_modulesvista-worker-module.js The Cache configuration is defined at about line 58: var connectCacheTo = require('ewd-qoper8-cache'); var params = { namespace: 'VISTA' }; Change the namespace and path if required, eg var params = { path: 'C:InterSystemsCache2015-2mgr', namespace: 'GOLD' };
  • 17. Copyright © 2016 M/Gateway Developments Ltd Configure ewd-qoper8-vistarpc Some systems may use a different username & password for Caché also Defaults are _SYSTEM and SYS respectively. If yours are different, edit appropriately, eg: var params = { path: 'C:InterSystemsCache2015-2mgr', namespace: 'GOLD', username: 'CacheUser', password: 'secret1234' };
  • 18. Copyright © 2016 M/Gateway Developments Ltd Start ewd-qoper8-vistarpc cd ewd3 node ewd-vista-express Worker Bootstrap Module file written to node_modules/ewd-qoper8-worker.js ======================================================== ewd-qoper8 is up and running. Max worker pool size: 1 ======================================================== ewd-qoper8-vistarpc is now running and listening on port 8080
  • 19. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8-vistarpc APIs • There are really only two: – login • Authenticates the user via his/her Access Code & Verify Code • Returns a security / EWD Session token – runRPC • Executes the specified RPC • Request must be authenticated using a valid token
  • 20. Copyright © 2016 M/Gateway Developments Ltd Logging In • For testing, use a REST client, eg: – Postman – Chrome Advanced REST Client
  • 21. Copyright © 2016 M/Gateway Developments Ltd Logging In Enter the URL: /vista/login
  • 22. Copyright © 2016 M/Gateway Developments Ltd Logging In Enter the URL: /vista/login Must be a POST
  • 23. Copyright © 2016 M/Gateway Developments Ltd Logging In Enter the URL: /vista/login Must be a POST Note the content-type
  • 24. Copyright © 2016 M/Gateway Developments Ltd Logging In Enter the URL: /vista/login Must be a POST Enter the Access Code & Verify Code as a JSON payload Note the content-type
  • 25. Copyright © 2016 M/Gateway Developments Ltd Logging In Enter the URL: /vista/login Must be a POST Enter the Access Code & Verify Code as a JSON payload Note the content-type Success!
  • 26. Copyright © 2016 M/Gateway Developments Ltd Logging In Copy this token:
  • 27. Copyright © 2016 M/Gateway Developments Ltd runRPC • Now that you're logged in, you can invoked any RPC that your Access Code is allowed to use. The URL is: POST http://192.168.1.100:8080/vista/runRPC/[RPC Name] For example POST http://192.168.1.100:8080/vista/runRPC/DDR GETS ENTRY DATA Note you may need to URL-escape the URL: POST http://192.168.1.100:8080/vista/runRPC/DDR%20GETS%20ENTRY%20DATA
  • 28. Copyright © 2016 M/Gateway Developments Ltd runRPC • runRPC POST requests must be authenticated using the Session Token returned by a successful /login request • The token value is used in the Authorization header
  • 29. Copyright © 2016 M/Gateway Developments Ltd Try it Enter the escaped URL: /vista/runRPC/…
  • 30. Copyright © 2016 M/Gateway Developments Ltd Try it Enter the escaped URL: /vista/runRPC/… Must be a POST
  • 31. Copyright © 2016 M/Gateway Developments Ltd Try it Enter the escaped URL: /vista/runRPC/… Valid token used as value for Authorization header Must be a POST
  • 32. Copyright © 2016 M/Gateway Developments Ltd Try it Enter the escaped URL: /vista/runRPC/… Valid token used as value for Authorization header JSON payload appropriate for the content needed for the specified RPC Must be a POST
  • 33. Copyright © 2016 M/Gateway Developments Ltd Try it Enter the escaped URL: /vista/runRPC/… Valid token used as value for Authorization header JSON payload appropriate for the content needed for the specified RPC Must be a POST Successful response JSON content depends on RPC
  • 34. Copyright © 2016 M/Gateway Developments Ltd Symbol Table Maintenance • After successful /login, the Mumps symbol table is saved to the user's Session – Uses a special undocumented Caché function: • $zu(160) • Very high-speed symbol-table copy to/from a global (in this case the user's Session global) – The user's DUZ etc is therefore captured
  • 35. Copyright © 2016 M/Gateway Developments Ltd Symbol Table Maintenance • When a runRPC request is received: – Token in Authorization header is checked – If valid, it now knows the user's Session – Symbol table is restored into Caché process • On completion of runRPC, after response returned to client: – Symbol table is saved back to user's Session
  • 36. Copyright © 2016 M/Gateway Developments Ltd Symbol Table Maintenance • RPC is therefore invoked in user's correct run-time MUMPS context – DUZ etc is correct for each RPC invoked by a user • Even though RPCs are being invoked statelessly by potentially different Caché processes each time, they appear to be running in a stateful environment
  • 37. Copyright © 2016 M/Gateway Developments Ltd Ongoing Development • Some functionality isn't necessarily correct, eg: – Handling contexts • ewdVistARPC Mumps routine needs peer review and discussion – eg Sam Habiel and Nikolay Topalov already discussing its finer details – Use the EWD Google group for such discussions