Xbase++
Xbase++
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 Xbase++ Downloads
LOCAL nSuccess
LOCAL oRest
LOCAL nBTls
LOCAL nBAutoReconnect
LOCAL nStatusCode
LOCAL oSbError
LOCAL oBdBody
LOCAL nChunkResult
nSuccess := 0
oRest := CreateObject("Chilkat.Rest")
nBTls := 1
nBAutoReconnect := 1
nSuccess := oRest:Connect("example.com", 443, nBTls, nBAutoReconnect)
IF (nSuccess == 0)
? oRest:LastErrorText
oRest:destroy()
RETURN
ENDIF
nSuccess := oRest:SendReqNoBody("GET", "/api/largefile")
IF (nSuccess == 0)
? oRest:LastErrorText
oRest:destroy()
RETURN
ENDIF
nStatusCode := oRest:ReadResponseHeader()
IF (nStatusCode < 0)
? oRest:LastErrorText
oRest:destroy()
RETURN
ENDIF
// 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 (nStatusCode != 200)
oSbError := CreateObject("Chilkat.StringBuilder")
nSuccess := oRest:ReadRespSb(oSbError)
IF (nSuccess == 0)
? oRest:LastErrorText
oRest:destroy()
oSbError:destroy()
RETURN
ENDIF
? "Request failed with status code " + Str(nStatusCode)
? oSbError:GetAsString()
oRest:destroy()
oSbError:destroy()
RETURN
ENDIF
// 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.
oBdBody := CreateObject("Chilkat.BinData")
nChunkResult := oRest:ReadRespChunkBd(8192, oBdBody)
DO WHILE nChunkResult > 0
nChunkResult := oRest:ReadRespChunkBd(8192, oBdBody)
ENDDO
IF (nChunkResult < 0)
? oRest:LastErrorText
oRest:destroy()
oSbError:destroy()
oBdBody:destroy()
RETURN
ENDIF
? "Received " + Str(oBdBody:NumBytes) + " bytes."
oRest:destroy()
oSbError:destroy()
oBdBody:destroy()