Sample code for 30+ languages & platforms
Visual FoxPro

REST Read Response with Stream API

See more REST Examples

Demonstrates how to make a REST call that returns a binary body, and to receive the body through a stream API.

Chilkat Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loRest
LOCAL lnBTls
LOCAL lnPort
LOCAL lnBAutoReconnect
LOCAL loAuthAws
LOCAL lnResponseStatusCode
LOCAL lcErrResponse
LOCAL loBodyStream
LOCAL loReadResponseBodyTask
LOCAL loNextChunk

lnSuccess = 0

* This example requires the Chilkat API to have been previously unlocked.
* See Global Unlock Sample for sample code.

loRest = CreateObject('Chilkat.Rest')

* Connect to the Amazon AWS REST server.
lnBTls = 1
lnPort = 443
lnBAutoReconnect = 1
lnSuccess = loRest.Connect("s3.amazonaws.com",lnPort,lnBTls,lnBAutoReconnect)

* ----------------------------------------------------------------------------
* Important: For buckets created in regions outside us-east-1,
* there are three important changes that need to be made.
* See Working with S3 Buckets in Non-us-east-1 Regions for the details.
* ----------------------------------------------------------------------------

* Provide AWS credentials for the REST call.
loAuthAws = CreateObject('Chilkat.AuthAws')
loAuthAws.AccessKey = "AWS_ACCESS_KEY"
loAuthAws.SecretKey = "AWS_SECRET_KEY"
loAuthAws.ServiceName = "s3"
lnSuccess = loRest.SetAuthAws(loAuthAws)

* Set the bucket name via the HOST header.
* In this case, the bucket name is "chilkat100".
loRest.Host = "chilkat100.s3.amazonaws.com"

* Send the request to download the JPG.
lnSuccess = loRest.SendReqNoBody("GET","/starfish.jpg")
IF (lnSuccess <> 1) THEN
    ? loRest.LastErrorText
    RELEASE loRest
    RELEASE loAuthAws
    CANCEL
ENDIF

* Read the response header.
lnResponseStatusCode = loRest.ReadResponseHeader()
IF (lnResponseStatusCode < 0) THEN
    ? loRest.LastErrorText
    RELEASE loRest
    RELEASE loAuthAws
    CANCEL
ENDIF

? "Response status code = " + STR(lnResponseStatusCode)

* We expect a 200 response status if the JPG data is coming.
* Otherwise, we'll get a string response body with an error message(or no response body).
IF (lnResponseStatusCode <> 200) THEN
    lcErrResponse = loRest.ReadRespBodyString()
    IF (loRest.LastMethodSuccess <> 1) THEN
        ? loRest.LastErrorText
    ELSE
        ? lcErrResponse
    ENDIF

    RELEASE loRest
    RELEASE loAuthAws
    CANCEL
ENDIF

loBodyStream = CreateObject('Chilkat.Stream')
* Set a 10 second read timeout for the stream. 
* (Give up if no data arrives within 10 seconds after calling a read method.)
loBodyStream.ReadTimeoutMs = 10000

* Create a background thread task to read the response body (which feeds
* it to the bodyStream object.)
loReadResponseBodyTask = loRest.ReadRespBodyStreamAsync(loBodyStream,1)

* Start the task. 
lnSuccess = loReadResponseBodyTask.Run()

* The application can now read the bodyStream...
DO WHILE (loBodyStream.EndOfStream <> 1)

    * Read the next chunk of bytes (whatever is immediately available,
    * or wait for more data (up to 10 seconds because we set the stream's ReadTimeoutMs property)
    loNextChunk = loBodyStream.ReadBytes()
    IF (loBodyStream.LastMethodSuccess <> 1) THEN
        ? "Failed to receive more response data."
        * Make sure the background task is aborted/cancelled.
        lnSuccess = loReadResponseBodyTask.Cancel()
        RELEASE loReadResponseBodyTask
        RELEASE loRest
        RELEASE loAuthAws
        RELEASE loBodyStream
        CANCEL
    ENDIF

    * OK.. the app has the next chunk of the body, and may do whatever it wishes with it...
ENDDO

RELEASE loReadResponseBodyTask

? "Successfully received the entire response body."

RELEASE loRest
RELEASE loAuthAws
RELEASE loBodyStream