Unicode C
Unicode C
Read the REST Response Body in Chunks
See more REST Examples
Demonstrates Rest.ReadRespChunkBd, which reads the response body one chunk at a time, appending each chunk to a BinData. A return value of 0 signals the body is complete, while -1 indicates a read failure.
Background. Chunked reading lets an application process a large response incrementally rather than buffering the entire body at once. It is used after ReadResponseHeader within the staged request model.
Chilkat Unicode C Downloads
#include <C_CkRestW.h>
#include <C_CkStringBuilderW.h>
#include <C_CkBinDataW.h>
void ChilkatSample(void)
{
BOOL success;
HCkRestW rest;
BOOL bTls;
BOOL bAutoReconnect;
int statusCode;
HCkStringBuilderW sbError;
HCkBinDataW bdBody;
int chunkResult;
success = FALSE;
rest = CkRestW_Create();
bTls = TRUE;
bAutoReconnect = TRUE;
success = CkRestW_Connect(rest,L"example.com",443,bTls,bAutoReconnect);
if (success == FALSE) {
wprintf(L"%s\n",CkRestW_lastErrorText(rest));
CkRestW_Dispose(rest);
return;
}
success = CkRestW_SendReqNoBody(rest,L"GET",L"/api/largefile");
if (success == FALSE) {
wprintf(L"%s\n",CkRestW_lastErrorText(rest));
CkRestW_Dispose(rest);
return;
}
statusCode = CkRestW_ReadResponseHeader(rest);
if (statusCode < 0) {
wprintf(L"%s\n",CkRestW_lastErrorText(rest));
CkRestW_Dispose(rest);
return;
}
// Check for the expected success status code. If the response is not 200, the body is likely
// error text formatted as JSON, XML, or HTML rather than the expected content. In that case read
// the body as text, report it, and return.
if (statusCode != 200) {
sbError = CkStringBuilderW_Create();
success = CkRestW_ReadRespSb(rest,sbError);
if (success == FALSE) {
wprintf(L"%s\n",CkRestW_lastErrorText(rest));
CkRestW_Dispose(rest);
CkStringBuilderW_Dispose(sbError);
return;
}
wprintf(L"Request failed with status code %d\n",statusCode);
wprintf(L"%s\n",CkStringBuilderW_getAsString(sbError));
CkRestW_Dispose(rest);
CkStringBuilderW_Dispose(sbError);
return;
}
// The status code is 200. Read the response body in chunks, appending each chunk to the BinData.
// Each call waits until at least the requested number of bytes is available, unless the response
// ends first. A return value of 0 means the final bytes were returned and the body is complete;
// -1 indicates a read failure.
bdBody = CkBinDataW_Create();
chunkResult = CkRestW_ReadRespChunkBd(rest,8192,bdBody);
while (chunkResult > 0) {
chunkResult = CkRestW_ReadRespChunkBd(rest,8192,bdBody);
}
if (chunkResult < 0) {
wprintf(L"%s\n",CkRestW_lastErrorText(rest));
CkRestW_Dispose(rest);
CkStringBuilderW_Dispose(sbError);
CkBinDataW_Dispose(bdBody);
return;
}
wprintf(L"Received %d bytes.\n",CkBinDataW_getNumBytes(bdBody));
CkRestW_Dispose(rest);
CkStringBuilderW_Dispose(sbError);
CkBinDataW_Dispose(bdBody);
}