This example code is a simple example showing how the MFC classes can be used to wrapper the HTTP API calls and retrieve product information. This example is retrieving a single product and displaying rudimentary details. Calling the API in this way has no dependencies on libraries.
If you do not program using C++/MFC this example still shows the overall logic that would be applicable to most languages
This code is deliberately simple and would need enhancing before use in production level code
- The code uses the returned XML string without using an XML parser
- The network call is made on the main thread and will block screen updates while waiting for a response on the network
- Network errors are displayed in technical form to the user
Code
Download Visual Studio Project (37Kb)
// Read user interface, [not shown here, download full source]
long thePid = ???; // Value from User Interface
// Build the URL we want
CString Url;
// For this example we request Named XML format
Url.Format("/gnap/M/buck?3=retailmax.elink.products&9=f100=%ld", thePid);
// Other formats are possible...
// Numeric XML
// Url.Format("/gnap/buck?3=retailmax.elink.products&9=f100=%ld", thePid);
// Named JSON
// Url.Format("/gnap/J/buck?3=retailmax.elink.products&9=f100=%ld", thePid);
// Numeric JSON
// Url.Format("/gnap/j/buck?3=retailmax.elink.products&9=f100=%ld", thePid);
CString gError;
CString ReplyString;
try {
CInternetSession sess("MFC_ReadProduct " __DATE__ " " __TIME__);
CHttpConnection* pHttp = sess.GetHttpConnection(m_ServerAddress, (INTERNET_PORT) port);
if (pHttp) {
const char* Accept[2] = { "*/*", NULL };
CHttpFile* pHFile = pHttp->OpenRequest("GET", Url, NULL, 1, (const char**) Accept);
if (pHFile) {
pHFile->SendRequest();
DWORD Status = 0;
pHFile->QueryInfoStatusCode(Status);
if ((Status >= 200) && (Status <= 299)) {
{
char bb[4096];
int readlen = pHFile->Read(bb, sizeof(bb));
while (readlen > 0) {
ReplyString += CString(bb, readlen);
readlen = pHFile->Read(bb, sizeof(bb));
}
}
} else {
switch (Status) {
case 404:
gError += "URL or file not found";
break;
default:
CString w;
w.Format("Request to server failed with error=%ld. Read failed", Status);
gError += w;
}
}
delete pHFile;
}
delete pHttp;
}
} catch (CInternetException*pI) {
char bb[4096];
pI->GetErrorMessage(bb, sizeof(bb));
gError += "Network level error:\n\n";
gError += bb;
pI->Delete();
}
if (! gError.IsEmpty()) {
AfxMessageBox(gError, MB_ICONSTOP);
return;
}
// Display raw response string AfxMessageBox(ReplyString);
// Decode and display response. [not shown here, download full source]
