Visual FoxPro
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
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