DataFlex
DataFlex
HTTP GET -- Read Response from Stream
See more REST Examples
Demonstrates how to send an HTTP GET for a web page, and then read the response from a Stream. The purpose is to fulfill a situation such as the following: "I have a URL and just want the <head> </head> portion of the HTML. This would avoid having to download a potentially enormous web page just to get at header information, such as the <styles>."Chilkat DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoRest
Handle hoUrl
Boolean iBAutoReconnect
Integer iResponseStatusCode
String sErrResponse
Variant vBodyStream
Handle hoBodyStream
Variant vReadResponseBodyTask
Handle hoReadResponseBodyTask
Handle hoSbBody
Boolean iExitLoop
String sBodyText
Integer iMaxWaitMs
String sTemp1
Integer iTemp1
Boolean bTemp1
Move False To iSuccess
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
Get Create (RefClass(cComChilkatRest)) To hoRest
If (Not(IsComObjectCreated(hoRest))) Begin
Send CreateComObject of hoRest
End
// In this example, we'll get the web page at http://www.nytimes.com/pages/business/index.html
// The domain is "www.nytimes.com", and the path is "/pages/business/index.html"
// If we have only the full URL to begin with, it can be loaded into the Chilkat URL object to
// access the parts:
Get Create (RefClass(cComChilkatUrl)) To hoUrl
If (Not(IsComObjectCreated(hoUrl))) Begin
Send CreateComObject of hoUrl
End
Get ComParseUrl Of hoUrl "http://www.nytimes.com/pages/business/index.html" To iSuccess
Move True To iBAutoReconnect
Get ComHost Of hoUrl To sTemp1
Get ComPort Of hoUrl To iTemp1
Get ComSsl Of hoUrl To bTemp1
Get ComConnect Of hoRest sTemp1 iTemp1 bTemp1 iBAutoReconnect To iSuccess
// Send the GET request (This sends the GET request, but does not read the response.)
Get ComPath Of hoUrl To sTemp1
Get ComSendReqNoBody Of hoRest "GET" sTemp1 To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoRest To sTemp1
Showln sTemp1
Procedure_Return
End
// Read the response header.
Get ComReadResponseHeader Of hoRest To iResponseStatusCode
If (iResponseStatusCode < 0) Begin
Get ComLastErrorText Of hoRest To sTemp1
Showln sTemp1
Procedure_Return
End
Showln "Response status code = " iResponseStatusCode
// We expect a 200 response status.
If (iResponseStatusCode <> 200) Begin
// If the response status code is not 200, we could check for a redirect status code and
// then follow it, read the entire response (as shown here), or just call rest.Disconnect
Get ComReadRespBodyString Of hoRest To sErrResponse
Get ComLastMethodSuccess Of hoRest To bTemp1
If (bTemp1 <> True) Begin
Get ComLastErrorText Of hoRest To sTemp1
Showln sTemp1
End
Else Begin
Showln sErrResponse
End
Procedure_Return
End
Get Create (RefClass(cComChilkatStream)) To hoBodyStream
If (Not(IsComObjectCreated(hoBodyStream))) Begin
Send CreateComObject of hoBodyStream
End
// Set a 10 second read timeout for the stream.
// (Give up if no data arrives within 10 seconds after calling a read method.)
Set ComReadTimeoutMs Of hoBodyStream To 10000
// Create a background thread task to read the response body (which feeds
// it to the bodyStream object.)
Get pvComObject of hoBodyStream to vBodyStream
Get ComReadRespBodyStreamAsync Of hoRest vBodyStream True To vReadResponseBodyTask
If (IsComObject(vReadResponseBodyTask)) Begin
Get Create (RefClass(cComChilkatTask)) To hoReadResponseBodyTask
Set pvComObject Of hoReadResponseBodyTask To vReadResponseBodyTask
End
// Start the task.
Get ComRun Of hoReadResponseBodyTask To iSuccess
// Read the HTTP response body until the "</head>" is seen, or until
// the end-of-stream is reached.
Get Create (RefClass(cComChilkatStringBuilder)) To hoSbBody
If (Not(IsComObjectCreated(hoSbBody))) Begin
Send CreateComObject of hoSbBody
End
Move False To iExitLoop
While (Not iExitLoop And ((ComEndOfStream(hoBodyStream)) <> True))
Get ComReadString Of hoBodyStream To sBodyText
Get ComLastMethodSuccess Of hoBodyStream To bTemp1
If (bTemp1 = True) Begin
Get ComAppend Of hoSbBody sBodyText To iSuccess
Get ComContains Of hoSbBody "</head>" False To bTemp1
If (bTemp1) Begin
Move True To iExitLoop
End
End
Else Begin
Move True To iExitLoop
End
Loop
// Cancel the remainder of the task...
Get ComCancel Of hoReadResponseBodyTask To iSuccess
Send Destroy of hoReadResponseBodyTask
// Ensure we're disconnected from the server.
Move 50 To iMaxWaitMs
Get ComDisconnect Of hoRest iMaxWaitMs To iSuccess
Showln "----"
Get ComGetAsString Of hoSbBody To sTemp1
Showln sTemp1
Showln "----"
Showln "Successfully received the body up to the desired point."
End_Procedure