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