Call a .NET Webservice using XMLHTTP,XMLDOM and VBScript

By Peter A. Bromberg, Ph.D.

Peter Bromberg

The appearance of Visual Studio .NET at the Professional Developers Conference in Orlando this July gave birth to a whole new world of exposed http-addressable services and component methods available to developers over the web. The Microsoft code name for this "bundle of joy", as it were, is "webservices". If webservices were a stock, I wouldn't short it just yet. It promises to be one of the most exciting new concepts on the web since Al Gore invented it. If you're not sure why webservices holds such promise, look at the diverse list of authors of the W3C SOAP 1.1 Specification and that should give you a clue:

http://www.w3.org/TR/2000/NOTE-SOAP-20000508/

The Microsoft flavor of webservice is not only incredibly easy to create using the Visual Studio IDE and the language of your choice in the Common Language Runtime (CLR), but they are also callable through SOAP and other methods including a straight HTTP GET with the parameter(s) name and value(s) on the querystring.



Lets take a look at a sample webservice that Microsoft exposes to the public, examine its interface, and write a HTTP page to access this service and present the results.  Actually, unlike most "examples", the page I have in mind is one that is quite useful and that you might very well want to have on your website. It's the MSDN Search Beta "Best Bets" webservice method. What this does is take your search phrase and match it up to a cached set of "Best Bet" matches at MSDN and return the result as well-formed XML.

Here is a link to the  the webservice "disco" page so you can see how a Microsoft webservice exposes itself:

http://beta.search.microsoft.com/search/

The webservice method we will be using is the second one, "GetBestBets."  To see what the result of a search will look like, click the link below for a search on "XML":

http://beta.search.microsoft.com/search/MSComSearchService.asmx/GetBestBets?Query=XML

What we'll do now is write a page with the least possible amount of code that will present a search form and display the items from the result XML document in a nice table, converting the "Title" element from each node into a nice hyperlink to its corresponding "Url" element, in a nice HTML table just below the Search form. We'll do this in a narrow 130 pixel wide table column so that the code can be inserted on the left or right side column of your web page.

First let's take a look at all the code, and then we'll walk through it:

<script language="VBScript" runat=Server>
function getResults()
Dim xmlDOC
Dim bOK
Dim HTTP
Set HTTP = CreateObject("MSXML2.XMLHTTP")
Set xmlDOC =CreateObject("MSXML.DOMDocument")
xmlDOC.Async=False
HTTP.Open "GET","http://beta.search.microsoft.com/search/MSComSearchService.asmx/GetBestBets?Query=" 
& document.all("SearchTerm").value , False
HTTP.Send()
bOK = xmlDOC.load(HTTP.responseXML)
if Not bOK then
	rtext.innerText = "Error loading XML from HTTP"
end if
' Note: Instead of making an XSL transform Stylesheet, we will use the selectNodes Method 
' with the XPath "//" search directive to get the ifornmation we want to display out of the
' XML DOMDocument. We'll use this to create our HTML Table "on the fly"
Dim objNodeListUrl
DIm objNodeListTitle
Set objNodeListUrl=xmlDOC.documentElement.selectNodes("//Url")
Set objNodeListTitle=xmlDOC.documentElement.selectNodes("//Title")
rtext.innerText = "Len: "& objNodeListUrl.Length
Dim I
Dim sTable
sTable = "<tableborder:1px solid black"" width=""130"">"
sTable=sTable &  "<trfont-size:8pt; font-family:Verdana; font-weight:bold; "
sTable =sTable & " text-decoration:underline"">"
sTable = sTable & "<td align=""center"">Results:</TD>"
For I = 0 to objNodeListUrl.Length -1
	sTable = sTable & "<trfont-family:Verdana; font-size:8pt; padding:0px 2px""><td>"
	sTable = sTable & "<a href=" & objNodeListUrl(i).text & ">"
	sTable = sTable & objNodeListTitle(i).text & "</a></TD>"
next
sTable=sTable & ""
rtext.innerHTML = sTable
stat.innerText ="Status: " & HTTP.statusText
end Function
</script>
<div align=Center><font face=Tahoma size=2><b>MSDN "Best Bets":</b><br>
  Enter Search Term</FONT><b><br>
  <input type="text" name="SearchTerm" value="" size=12>
  <br>
  <input type="button" value="Get Results" onClick="getResults()">
  </div>
<center>
<div id=rtext></div><p>
<div id=stat></div>

 

The first part of our code is the VBScript function getResults(). This is called via the onClick event of the button control, and sets references to the XMLHTTP object we'll use to send our request, and the XMLDOMDocument object we'll use to hold the well-formed XML document that the webservice returns to our page.

We set the async property to "false" - we want to wait until our result comes back. We call the XMLHTTP.Open method with "GET" because that is what the webservice is looking for. To the querystring, we append the value for SearchTerm that the user entered into the form with document.all("SearchTerm").value, and then we call the Send() method to send our XMLHTTP request over the wire.

If everything works, we get back our response XML in the xmlDOC.load(HTTP.responseXML) and our XMLDOMDocument is in xmlDOC.

Now we can do whatever we need to get out the pertinent information and display it the way we want. Normally I would load an XSL Styesheet in a separate DOMDocument and call xmlDOC.transformNode(xslDOC) to get my HTML for display. But here, we really need such a small amount of information from the xml aggregate that instead we'll use some XPATH to "extract" the values from the nodelists we need, and simply create our HTML table "inline".

So the next step is that we define two nodelists with:

Dim objNodeListUrl
Dim objNodeListTitle
Set objNodeListUrl=xmlDOC.documentElement.selectNodes("//Url")
Set objNodeListTitle=xmlDOC.documentElement.selectNodes("//Title")

This give us two node lists, one containing all the "Url" element values, and the other containing all the "Title" values, and now we have everything we need to construct our table of titles and associated hyperlinks.

We start building our table HTML in the strTable variable, and iterate through the nodelists with:

For I = 0 to objNodeListUrl.Length -1

and we concatenate our string with the objNodeListUrl(i).text and objNodeListTitle(i).text values. The result is a string containing our HTML table, and we set the value of the <div> tag rtext.innerHTML to this string. To try it out, Click here. You can get the source by simple saving the page after you've tried it.

Peter Bromberg is a Senior Programmer /Analyst at FiServ, Inc. in Orlando and a co-developer of the EggheadCafe.com developer website. He can be reached at pbromberg@yahoo.com