Sample code for 30+ languages & platforms
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

Xbase++
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()