We had a meeting today with some great guys with an even greater service that we’re going to be integrating with our online accounting software.
Their service is exposed as a .Net SOAP webservice. Now you’d think that wouldn’t be a problem for us as our own accounting API uses the same technology. Well, you’d be wrong. Our core product is still coded in classic ASP / VBScript.
So the challenge was to talk to a SOAP webservice from VBScript. Google threw up a few results, none of them exactly what I needed. The closest was a blog post by Ken Hughes. So I took his approach and re-wrote it for my needs. It’s not the prettiest piece of code I’ve ever written, and would certainly be nicer as a class. But it does the job.
Enough talk, here are the goods. First an include file with all the functions, etc:
Download: _consumewebservice.asp
<% SOAP_ENDPOINT = "" SOAP_NS = "" SOAP_FUNCTION = "" SOAP_REQUEST = "" SOAP_RESPONSE = "" function SOAP_StartRequest(sEndPoint, sNameSpace, sFunction) SOAP_ENDPOINT = sEndPoint SOAP_NS = sNameSpace SOAP_FUNCTION = sFunction 'do the SOAP envelope SOAP_REQUEST = "" SOAP_REQUEST = SOAP_REQUEST + " " 'start the SOAP body SOAP_REQUEST = SOAP_REQUEST + "" 'start function SOAP_REQUEST = SOAP_REQUEST + "" end function Function SOAP_AddParameter(byval strParam, byval strValue) Dim strSoap SOAP_REQUEST = SOAP_REQUEST + "" SOAP_REQUEST = SOAP_REQUEST + strValue SOAP_REQUEST = SOAP_REQUEST + "" End Function function SOAP_SendRequest() 'end function, body and envelope SOAP_REQUEST = SOAP_REQUEST + "" SOAP_REQUEST = SOAP_REQUEST + "" SOAP_REQUEST = SOAP_REQUEST + "" Dim oHttp Dim strResult Set oHttp = CreateObject("Msxml2.XMLHTTP") oHttp.open "POST", SOAP_ENDPOINT, false oHttp.setRequestHeader "Content-Type", "text/xml" oHttp.setRequestHeader "SOAPAction", SOAP_NS + "/" & SOAP_FUNCTION oHttp.send SOAP_REQUEST SOAP_RESPONSE = oHttp.responseText end function Function SOAP_GetResult(resultParam) Dim oXml Set oXml = CreateObject("Msxml2.DOMDocument") oXml.Async = true oXml.LoadXml SOAP_RESPONSE Dim strPath strPath = "/*/*//" + resultParam Dim oNode Set oNode = oXml.documentElement.SelectSingleNode(strPath) SOAP_GetResult = oNode.Text End Function %>
And now a quick demo. This connects to our accounting API, calls the GetInvoice function and gives you a couple of the return values.
Download: tryit.asp
<!--#include virtual="_consumeWebservice.asp"--> <% SOAP_StartRequest "https://secure.kashflow.co.uk/api/service.asmx", "KashFlow", "GetInvoice" SOAP_AddParameter "UserName", "yourusername" SOAP_AddParameter "Password", "yourpassword" SOAP_AddParameter "InvoiceNumber", "37" SOAP_SendRequest %> <html> <head> </head> <body> Status: <%=SOAP_GetResult("Status")%><br /> NetAmount: <%=SOAP_GetResult("NetAmount")%><br /> VATAmount: <%=SOAP_GetResult("VATAmount")%><br /> </body> </html>
There are some limitations – it doesn’t handle complex types in the request. But it does what I need it to do and hopefully it’ll be of use to someone else out there.
Pingback: The KashFlow SaaS Accounting Blog - Sending a Tweet via MS SQL Server KashFlow Accounting Software()