Code
Contents
We packaged the code in a ‘quest’ shared module to make a nice clean API to work with.
This is how the Translator is meant to be used, by abstracting the complexity of the underlying plumbing into a shared into a shared modules. However when something goes wrong we can easily get under the hood to see what is going wrong. This is really important when dealing with a complex and ambiguous protocol like SOAP, because there will always be problems.
Here’s the code for the main:
require('node')
require('quest')
local User ='user'
local Password = 'password'
local function trace(a,b,c,d) return end
function main(HL7)
local X = quest.PlaceOrder(HL7,
User, Password)
trace(X)
if quest.IsFault(X) then
quest.GetFault(X)
else
quest.GetResponse(X)
end
end
Here’s the code for the ‘quest’ module:
quest ={}
local function trace(a,b,c,d) return end
local Url = 'https://cert.hub.care360.com/orders/service'
T = [==[<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ord="http://medplus.com/orders">
<soapenv:Header/>
<soapenv:Body>
<ord:submitOrder soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<order xsi:type="java:Order" xs:type="type:Order" xmlns:java="java:com.medplus.serviceHub.orders.webservice" xmlns:xs="http://www.w3.org/2000/XMLSchema-instance">
<hl7Order xsi:type="xsd:base64Binary">${globalCleanHL7}</hl7Order>
</order>
</ord:submitOrder>
</soapenv:Body>
</soapenv:Envelope>]==]
local function MakePayload(HL7)
local P = xml.parse{data=T}
P["soapenv:Envelope"]["soapenv:Body"]["ord:submitOrder"].order.hl7Order[2]
= filter.base64.enc(HL7)
return P
end
function quest.PlaceOrder(HL7, User, Password)
local E = MakePayload(HL7)
trace(E)
local D,R = net.http.post{
url=Url,
auth={username=User, password=Password},
headers={['Content-Type']='text/xml',
SOAPAction=Url..'/submitOrder'},
body=E:S(), live=true}
if (R == 401) then
error('Looks like the user name and password were wrong.')
end
return xml.parse{data=D}
end
-- Returns nil if we do not have a SOAP fault response
function quest.IsFault(X)
return X["env:Envelope"]["env:Body"]["env:Fault"]
end
-- Extracts the response message from a non fault response
function quest.GetResponse(X)
return X["env:Envelope"]["env:Body"]
["m:submitOrderResponse"].result.responseMsg[2]:S()
end
-- Extracts the error message from a fault response
function quest.GetFault(X)
return X["env:Envelope"]["env:Body"]["env:Fault"].
detail["bea_fault:stacktrace"][2]:S()
end
Continue: Next steps