While I was writing some code on VBScript to avoid manual tasks that we currently do with a bunch of files, I needed to automatically upload some information extracted from all these files to a SQL database. One way to do it is using a Web Service that receives the data and store it into the database.
Our Web Service is able to receive the following protocols: SOAP 1.1, SOAP 1.2 and HTTP POST. For simplicity, we are going to use HTTP POST, which receive the parameters in the query string format (param1=value1¶m2=value2&…). In the other protocols (SOAP) we would need to send the parameters in a XML way (which is more powerful but a little more extensive to implement).
The expected HTTP request will be:
POST /WebService.asmx/WebMethod HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: length param=string
And the response (in XML format):
HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <string xmlns="http://tempuri.org/">string</string>
So, to call the Web Service directly from the VBScript, we can use the following code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
'The object that will make the call to the WS Set oXMLHTTP = CreateObject("Microsoft.XMLHTTP") 'The object that will receive the answer from the WS Set oXMLDoc = CreateObject("Microsoft.XMLDOM") strParam = "string to pass" 'Tell the name of the subroutine that will handle the response oXMLHTTP.onreadystatechange = getRef("HandleStateChange") 'Initializes the request (the last parameter, False in this case, tells if the call is asynchronous or not oXMLHTTP.open "POST", "http://localhost/WebService.asmx/WebMethod", False 'This is the content type that is expected by the WS using the HTTP POST protocol oXMLHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 'Now we send the request to the WS oXMLHTTP.send "parameter=" & strParam Sub HandleStateChange() Dim szResponse 'When the call has been completed (ready state 4) If oXMLHTTP.readyState = 4 Then szResponse = oXMLHTTP.responseText oXMLDoc.loadXML szResponse 'If the WS response is not in XML format, there is a problem If oXMLDoc.parseError.errorCode <> 0 Then WScript.Echo "ERROR:" WScript.Echo oXMLHTTP.responseText WScript.Echo oXMLDoc.parseError.reason Else WScript.Echo "Result: " & oXMLDoc.getElementsByTagName("string")(0).childNodes(0).Text End If End If End Sub
The ready state tells us about the connection with the Web Service:
- 0: Uninitialized – open() has not been called yet.
- 1: Loading – send() has not been called yet.
- 2: Loaded – send() has been called, headers and status are available.
- 3: Interactive – Downloading, responseText holds the partial data.
- 4: Completed – Finished with all operations.