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:
open - Opens a HTTP connection.
send - Sends a HTTP request.
abort - Cancels HTTP request.
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
Enough of the theory. Let's get practical. Let's take a simple example to demonstrate how
IXMLHttpRequest can be used.
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.
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.
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:
vAsync, vUser, vPassword);
szRequest = "<RequestStockPrice Symbol='";
szRequest += m_szSymbol;
szRequest += "'/>";
vRequest.vt = VT_BSTR;
vRequest.bstrVal = szRequest.AllocSysString();
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;
MSXML::IXMLDOMNodePtr XMLRootResponseNode =
if ( XMLRootResponseNode != NULL )
MSXML::IXMLDOMNodePtr XMLLastTradeNode =
if ( XMLLastTradeNode != NULL )
m_dblPrice = atof(szStockPrice);
m_szErrorText = "OK";
bRetVal = TRUE;
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:
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:
if ( rs.EOF = false ) then
For each field in rs.Fields
Response.Write stockSymbol & " : Stock symbol not found in database"
The response string will look like this:
I used a simple Access database which has two fields,
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.
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
open() method appropriately. This sample application will not work if the URL specified is wrong.