Hello! I have been using the GetToString() function to retrieve my content, but it seems that it fails one every 10 times.
Here is the code I am using
' request the content feed from the API xfer = CreateObject("roURLTransfer") xfer.SetCertificatesFile("common:/certs/ca-bundle.crt") xfer.InitClientCertificates() url = "https://myvalidurl.com/page?parameter=sample" xfer.SetURL(url) rsp = xfer.GetToString()
I am unsure why but rsp is equal to an empty string once every 10 times and the correct content the rest of the time.
I am 100% sure that my URL link is valid when the code fails to retrieve the content for that URL is static and never changes. On a web browser, the content is always returned with a 100% success rate.
I tried using an async version of the same code but it yielded the same results :
'request the content feed from the API xfer = CreateObject("roURLTransfer") xfer.SetCertificatesFile("common:/certs/ca-bundle.crt") xfer.InitClientCertificates() url = "https://myvalidurl.com/page?parameter=sample" port = CreateObject("roMessagePort") xfer.SetMessagePort(port) print url xfer.SetURL(url) if xfer.AsyncGetToString() rsp = wait(10000, port) print type(rsp) if type(rsp) = "roUrlEvent" rawData = rsp.GetString() ProcessContent(rawData) end if else 'Should not get there notifyError = true end if
What happens on that bit of code is rawData is indeed populated but with an empty string ("") instead of the correct data. My code works 90% of the time but sometimes the content is just failed to be retrieved.
Any idea of what I should do to secure the content retrieval? I could re-run the URL request if it returns empty but it does not seem like a pretty solution.
Thank you for your help.
Before you use GetString() you should be checking the response code with rsp.GetResponseCode(). If it's not 200 reissue the async transfer.
Before you use GetString() you should be checking the response code with rsp.GetResponseCode(). If it's not 200 reissue the async transfer.
Hey, I made a recursive function to do that and it seems to work fine. Here is the code I used :
'***************************************************************************************** ' GetContent '***************************************************************************************** sub GetContent() ' request the content feed from the API xfer = CreateObject("roURLTransfer") xfer.SetCertificatesFile("common:/certs/ca-bundle.crt") xfer.InitClientCertificates() port = CreateObject("roMessagePort") xfer.SetMessagePort(port) xfer.SetURL("https://myvalidurl.com/page?parameter=sample") data = TryToGetData(xfer, port, 5) if data <> invalid and data <> "" ProcessContent(data) else m.top.error++ end if end sub '***************************************************************************************** ' TryToGetData '***************************************************************************************** function TryToGetData(xfer, port, numberOfTries) if numberOfTries < 0 return invalid end if if xfer.AsyncGetToString() rsp = wait(10000, port) print type(rsp) if type(rsp) = "roUrlEvent" code = rsp.GetResponseCode() print "Response code is " code if code <> 200 print "Re-trying to load content" triesRemaining = numberOfTries - 1 return TryToGetData(xfer, port, triesRemaining) else print "Content retrieved correctly" return rsp.GetString() end if end if end if ' Should never get here return invalid end function