Introduction
Did you ever think of writing a Windows based application that talks to a web server and displays the results from a web server? If you didn't, well this is the right time to. "Why now?" you may ask. Because, a new interface, IXMLHttpRequest
, is provided as part of Microsoft XML parser, which makes making HTTP requests effortless.
IXMLHttpRequest
supports HTTP communication from a client to a server. The following is a snapshot of some of the important methods and properties:
IXMLHttpRequest Methods
open
- Opens a HTTP connection.
send
- Sends a HTTP request.
abort
- Cancels HTTP request.
IXMLHttpRequest Properties
responseText
- HTTP response text
status
- HTTP status
statusText
- HTTP status text
As you see, IXMLHttpRequest
is an easy to use interface. To make a HTTP request, you just open a HTTP connection using the open()
method, send the HTTP request using the send()
method, and read the response message from the responseText
property.
Enough of the theory. Let's get practical. Let's take a simple example to demonstrate how IXMLHttpRequest
can be used.
Example
The sample MFC application displays stock price for a stock symbol from the web server. The MFC application will make a HTTP request to get the stock price from the web server. It will also display the HTTP status code and status message, just in case if anything goes wrong.
Architecture
Here is the architecture diagram of the sample application. It doesn't need much explanation. However, I wanted to draw your attention to the fact that this tiny application is a perfect 3 tier application. We have a UI tier, a business logic tier (ASP files), and a database tier.
User Interface
When you enter a stock symbol and hit the GetPrice button, that's when a synchronous HTTP request is sent to the server. The following self-explanatory code sends a HTTP request:
HttpRequest->open("POST",
"http://localhost/GetStockPrice.asp",
vAsync, vUser, vPassword);
CString szRequest;
szRequest = "<RequestStockPrice Symbol='";
szRequest += m_szSymbol;
szRequest += "'/>";
VARIANT vRequest;
vRequest.vt = VT_BSTR;
vRequest.bstrVal = szRequest.AllocSysString();
HttpRequest->send(vRequest);
The web server sends the response back in an XML string. Once the client gets the response text, it has to process the XML to fetch the stock price. Here is the code below which processes the response:
Note: The code section below does not list the complete code. Look in the source files for complete code.
_bstr_t bsResponse = HttpRequest->responseText;
XMLDom->loadXML(bsResponse);
MSXML::IXMLDOMNodePtr XMLRootResponseNode =
XMLDom->selectSingleNode("ResponseStockPrice");
if ( XMLRootResponseNode != NULL )
{
MSXML::IXMLDOMNodePtr XMLLastTradeNode =
XMLRootResponseNode->selectSingleNode("LastTradePrice");
if ( XMLLastTradeNode != NULL )
{
CString szStockPrice((char*)XMLRootResponseNode->text);
m_dblPrice = atof(szStockPrice);
m_szErrorText = "OK";
bRetVal = TRUE;
}
}
ASP file
The ASP file GetStockPrice.asp will receive the HTTP request in a XML form. Suppose you entered CSCO in the stock symbol edit box, this is how the request string will look like:
<RequestStockPrice Symbol='CSCO'/>
The ASP file reads the stock symbol from the above XML request string and makes a database query to fetch the stock price for this specific symbol. Here is how the database query will look like:
SELECT LastTradePrice FROM RealTimeStock where Symbol ='CSCO'
The final step is to form the XML response string, which is done by the code below:
Response.Write("<ResponseStockPrice>")
if ( rs.EOF = false ) then
For each field in rs.Fields
Response.Write("<")
Response.Write field.Name
Response.Write(">")
Response.Write field.Value
Response.Write("</")
Response.Write field.Name
Response.Write(">")
Next
else
Response.Write("<ErrorMesg>")
Response.Write stockSymbol & " : Stock symbol not found in database"
Response.Write("</ErrorMesg>")
end if
Response.Write("</ResponseStockPrice>")
The response string will look like this:
<ResponseStockPrice><LastTradePrice>20</LastTradePrice></ResponseStockPrice>
Database
I used a simple Access database which has two fields, Symbol
and LastTradePrice
, as shown in the figure below. Note that the field Symbol
is the primary key.
XML Over HTTP
XML string is send over HTTP to accomplish our goal here. You may wonder whether this is a SOAP request. Though this application uses the same underlying principle of SOAP (i.e. XML Over HTTP), this is not a SOAP request since it doesn't adhere to the SOAP request protocols. Instead, it uses its own protocol for request and response strings.
Installation Notes
Download the client source files to your local computer. Download the server sources (ASP files and Access database file) to the root directory of your web server. Note that the sample application assumes that your web server runs on the same machine as the client. If your web server runs on a different machine, you have to change the URL name in IXMLHTTPRequest
's open()
method appropriately. This sample application will not work if the URL specified is wrong.
Dhandapani Ammasai(Dan in short) is a software delivery manager at a top tier IT company in India.