Article ID: | qGEN008 |
Date Revised: | May 02, 1998 |
Keywords: | Web, Contents, URL, HTML |
See Also: | KB Article Q174524 Download ReadURL.PRG (3KB) |
Question: How can I get the contents of a web page as a text string?
Answer: Here is a more useful version of the code presented in the above KB article. It fixes a couple of bugs and returns the item as a string instead of dumping it into a memo field. If you use the function to grab a binary file like a JPG you can save it as a file with:
create cursor xtemp mtemp (m)
append blank
replace mtemp with ReadURL( "http://SomeSite.com/SomeJPG.jpg" )
copy memo mtemp to somejpg.jpg
The modified code follows:
* readurl.prg 06-Mar-98
* 06-Mar-98 pulled from Q174524 on March 98 Technet CD
* 06-Mar-98 bug fixed about the length of the sReadBuffer
*Any Internet or intranet URL can be passed as a parameter. Microsoft.com
*was chosen for this example.
*Note that Microsoft Internet Explorer must be installed on the computer.
* passed: URLName, in the form "http://www.microsoft.com"
*
* returns: the content of the URL
*
* usage:
*
* uWebContent = ReadURL( "http://www.microsoft.com" )
* uWebContent = ReadURL( "http://www.SomeSite.com/SomeJPG.jpg" )
*
* notes:
* 1 - IE does not need to be running to use this, but must be installed,
* as the program uses an option that gets information from the registry
LPARAMETERS pcUrlName
DECLARE INTEGER InternetOpen IN wininet.DLL STRING sAgent, ;
INTEGER lAccessType, STRING sProxyName, ;
STRING sProxyBypass, INTEGER lFlags
DECLARE INTEGER InternetOpenUrl IN wininet.DLL ;
INTEGER hInternetSession, STRING sUrl, STRING sHeaders,;
INTEGER lHeadersLength, INTEGER lFlags, INTEGER lContext
DECLARE INTEGER InternetReadFile IN wininet.DLL INTEGER hfile, ;
STRING @sBuffer, INTEGER lNumberofBytesToRead, INTEGER @lBytesRead
DECLARE short InternetCloseHandle IN wininet.DLL INTEGER hInst
#DEFINE INTERNET_OPEN_TYPE_PRECONFIG 0
#DEFINE INTERNET_OPEN_TYPE_DIRECT 1
#DEFINE INTERNET_OPEN_TYPE_PROXY 3
#DEFINE SYNCHRONOUS 0
#DEFINE INTERNET_FLAG_RELOAD 2147483648
#DEFINE CR CHR(13)
local lsAgent, lhInternetSession, lhUrlFile, llOk, lnOk, lcRetVal, lcReadBuffer, lnBytesRead
* what application is using Internet services?
lsAgent = "VPF 5.0"
lhInternetSession = InternetOpen( lsAgent, INTERNET_OPEN_TYPE_PRECONFIG, ;
'', '', SYNCHRONOUS)
* debugging line - uncomment to see session handle
* WAIT WINDOW "Internet session handle: " + LTRIM(STR(hInternetSession))
IF lhInternetSession = 0
WAIT WINDOW "Internet session cannot be established" TIME 2
RETURN .null.
ENDIF
lhUrlFile = InternetOpenUrl( lhInternetSession, pcUrlName, '', 0, ;
INTERNET_FLAG_RELOAD, 0)
* debugging line - uncomment to see URL handle
* WAIT WINDOW "URL Handle: " + LTRIM(STR(hUrlFile))
IF lhUrlFile = 0
WAIT WINDOW "URL cannot be opened"
RETURN .null.
ENDIF
lcRetVal = ""
llOk = .t.
DO WHILE llOK
* set aside a big buffer
lsReadBuffer = SPACE(32767)
lnBytesRead = 0
lnOK = InternetReadFile( lhUrlFile, @lsReadBuffer, LEN(lsReadBuffer), @lnBytesRead)
if ( lnBytesRead > 0 )
lcRetVal = lcRetVal + left( lsReadBuffer, lnBytesRead )
endif
* error trap - either a read failure or read past eof()
llOk = ( lnOK = 1 ) and ( lnBytesRead > 0 )
ENDDO
* close all the handles we opened
InternetCloseHandle( lhUrlFile )
InternetCloseHandle( lhInternetSession )
* return the URL contents
RETURN lcRetVal