Unicode C
Unicode C
HTTP GET -- Read Response from Stream
See more REST Examples
Demonstrates how to send an HTTP GET for a web page, and then read the response from a Stream. The purpose is to fulfill a situation such as the following: "I have a URL and just want the <head> </head> portion of the HTML. This would avoid having to download a potentially enormous web page just to get at header information, such as the <styles>."Chilkat Unicode C Downloads
#include <C_CkRestW.h>
#include <C_CkUrlW.h>
#include <C_CkStreamW.h>
#include <C_CkTaskW.h>
#include <C_CkStringBuilderW.h>
void ChilkatSample(void)
{
BOOL success;
HCkRestW rest;
HCkUrlW url;
BOOL bAutoReconnect;
int responseStatusCode;
const wchar_t *errResponse;
HCkStreamW bodyStream;
HCkTaskW readResponseBodyTask;
HCkStringBuilderW sbBody;
BOOL exitLoop;
const wchar_t *bodyText;
int maxWaitMs;
success = FALSE;
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
rest = CkRestW_Create();
// In this example, we'll get the web page at http://www.nytimes.com/pages/business/index.html
// The domain is "www.nytimes.com", and the path is "/pages/business/index.html"
// If we have only the full URL to begin with, it can be loaded into the Chilkat URL object to
// access the parts:
url = CkUrlW_Create();
CkUrlW_ParseUrl(url,L"http://www.nytimes.com/pages/business/index.html");
bAutoReconnect = TRUE;
success = CkRestW_Connect(rest,CkUrlW_host(url),CkUrlW_getPort(url),CkUrlW_getSsl(url),bAutoReconnect);
// Send the GET request (This sends the GET request, but does not read the response.)
success = CkRestW_SendReqNoBody(rest,L"GET",CkUrlW_path(url));
if (success != TRUE) {
wprintf(L"%s\n",CkRestW_lastErrorText(rest));
CkRestW_Dispose(rest);
CkUrlW_Dispose(url);
return;
}
// Read the response header.
responseStatusCode = CkRestW_ReadResponseHeader(rest);
if (responseStatusCode < 0) {
wprintf(L"%s\n",CkRestW_lastErrorText(rest));
CkRestW_Dispose(rest);
CkUrlW_Dispose(url);
return;
}
wprintf(L"Response status code = %d\n",responseStatusCode);
// We expect a 200 response status.
if (responseStatusCode != 200) {
// If the response status code is not 200, we could check for a redirect status code and
// then follow it, read the entire response (as shown here), or just call rest.Disconnect
errResponse = CkRestW_readRespBodyString(rest);
if (CkRestW_getLastMethodSuccess(rest) != TRUE) {
wprintf(L"%s\n",CkRestW_lastErrorText(rest));
}
else {
wprintf(L"%s\n",errResponse);
}
CkRestW_Dispose(rest);
CkUrlW_Dispose(url);
return;
}
bodyStream = CkStreamW_Create();
// Set a 10 second read timeout for the stream.
// (Give up if no data arrives within 10 seconds after calling a read method.)
CkStreamW_putReadTimeoutMs(bodyStream,10000);
// Create a background thread task to read the response body (which feeds
// it to the bodyStream object.)
readResponseBodyTask = CkRestW_ReadRespBodyStreamAsync(rest,bodyStream,TRUE);
// Start the task.
success = CkTaskW_Run(readResponseBodyTask);
// Read the HTTP response body until the "</head>" is seen, or until
// the end-of-stream is reached.
sbBody = CkStringBuilderW_Create();
exitLoop = FALSE;
while (!exitLoop && (CkStreamW_getEndOfStream(bodyStream) != TRUE)) {
bodyText = CkStreamW_readString(bodyStream);
if (CkStreamW_getLastMethodSuccess(bodyStream) == TRUE) {
CkStringBuilderW_Append(sbBody,bodyText);
if (CkStringBuilderW_Contains(sbBody,L"</head>",FALSE)) {
exitLoop = TRUE;
}
}
else {
exitLoop = TRUE;
}
}
// Cancel the remainder of the task...
CkTaskW_Cancel(readResponseBodyTask);
CkTaskW_Dispose(readResponseBodyTask);
// Ensure we're disconnected from the server.
maxWaitMs = 50;
CkRestW_Disconnect(rest,maxWaitMs);
wprintf(L"----\n");
wprintf(L"%s\n",CkStringBuilderW_getAsString(sbBody));
wprintf(L"----\n");
wprintf(L"Successfully received the body up to the desired point.\n");
CkRestW_Dispose(rest);
CkUrlW_Dispose(url);
CkStreamW_Dispose(bodyStream);
CkStringBuilderW_Dispose(sbBody);
}