get data from the internet

Ramesh picture Ramesh · Mar 9, 2011 · Viewed 9k times · Source

I need to get the data from a secure URL (https) with a userid and password. How can I implement that.

I am able to access the data from a normal URL using the below command

li_rc = linet_main.GetURL("http://www.webservicex.net/WeatherForecast.asmx?WSDL", luo_data)

Thanks in advance, Ramesh.

Answer

Doug Porter picture Doug Porter · Mar 10, 2011

The approach I've found easiest is using the XMLHttp object via OLE. Here is an exported function from PB 10.5 that uses it to hit the encrypted Google page (it 404's on the post portion since their page is not accepting them, but the result is valid as an example).

$PBExportHeader$f_test_xmlhttps.srf
global type f_test_xmlhttps from function_object
end type

forward prototypes
global subroutine f_test_xmlhttps ()
end prototypes

global subroutine f_test_xmlhttps ();//First download and install the latest XMLHttp package
//(this link goes to the one listed in the connectToNewObject call
//http://www.microsoft.com/downloads/details.aspx?familyid=3144b72b-b4f2-46da-b4b6-c5d7485f2b42&displaylang=en#filelist

//XMLHttp object method summary
//http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/xmmscxmldommethods.asp

String ls_get_url, ls_post_url
String ls_post_variables, ls_response
String ls_response_text, ls_status_text
long   ll_status_code
OleObject loo_xmlhttp

//include parameters on the URL here for get parameters
ls_get_url = "https://encrypted.google.com/"

try
  //Create an instance of our COM object
  loo_xmlhttp = CREATE oleobject
  loo_xmlhttp.ConnectToNewObject("Msxml2.XMLHTTP.4.0")

  //First lets do a GET request 
  //All request parameters should be included in the URL
  loo_xmlhttp.open ("GET",ls_get_url, false)
  loo_xmlhttp.send()

  //Get our response
  ls_status_text = loo_xmlhttp.StatusText
  ll_status_code =  loo_xmlhttp.Status

  //Check HTTP Response code for errors
  //http://kbs.cs.tu-berlin.de/~jutta/ht/responses.html
  if ll_status_code >= 300 then
    MessageBox("HTTP GET Request Failed", ls_response_text)
  else
    //Get the response we received from the web server
    ls_response_text = loo_xmlhttp.ResponseText

    MessageBox("GET Request Succeeded", ls_response_text)
  end if

  //Lets do a POST now, We would pass a String
  //in the send() call that contains the post data in the 
  //format name1=value1&name2=value2&...
  ls_post_url = "https://encrypted.google.com/"
  ls_post_variables = ""

  loo_xmlhttp.open ("POST",ls_post_url, false)
  loo_xmlhttp.send(ls_post_variables)

  //Get our response
  ls_status_text = loo_xmlhttp.StatusText
  ll_status_code =  loo_xmlhttp.Status

  //Check HTTP Response code for errors
  //http://kbs.cs.tu-berlin.de/~jutta/ht/responses.html
  if ll_status_code >= 300 then
    MessageBox("HTTP POST Request Failed", ls_response_text)
  else
    //Get the response we received from the web server
    ls_response_text = loo_xmlhttp.ResponseText

    MessageBox("POST Request Succeeded", ls_response_text)
  end if

  //Done so cleanup
  loo_xmlhttp.DisconnectObject()

catch (RuntimeError rte)

  MessageBox("Error", "RuntimeError - " + rte.getMessage())

end try

end subroutine

Save that off as f_test_xmlhttps.srf and import into a pbl in PowerBuilder. This also works for HTTP as well.