Share this page 

Get a value from a REST serviceTag(s): WinApi/Registry


From this HowTo, we saw how to get a value from a JSON string. Habitually, we get a JSON string from a Web service exposed as REST service. It maybe difficult for Powerbuilder to call this kind of service because there is no way to specify HTTP header with regular Powerscript.

Fortunately, we can use two Windows COM objects, Msxml2.DOMDocument and MSXML2.ServerXMLHTTP, to do that.

For demonstration, we call a REST service that return the current date and time. This service is hosted at http://www.jsontest.com/. See the important note below.

OleObject lole_Send
OleObject lole_SrvHTTP
OleObject lole_ScriptControl

String ls_status
String ls_response
String ls_value

lole_Send = CREATE OleObject
lole_SrvHTTP = CREATE OleObject
lole_Send.connectToNewObject("Msxml2.DOMDocument.6.0")
lole_SrvHTTP.connectToNewObject("MSXML2.ServerXMLHTTP.6.0")
lole_SrvHTTP.Open("GET", "http://date.jsontest.com", FALSE)
lole_SrvHTTP.SetRequestHeader( "Content-Type", "application/json")
lole_SrvHTTP.Send(lole_Send)
ls_status = string(lole_SrvHTTP.Status)
ls_response = string(lole_SrvHTTP.ResponseText)

MessageBox("REST HTTP response", ls_status)  // 200 is OK!
MessageBox("JSON response", ls_response)

lole_ScriptControl = CREATE OleObject
lole_ScriptControl.ConnectToNewObject( "MSScriptControl.ScriptControl" )
lole_ScriptControl.Language = "JScript"
lole_ScriptControl.AddCode("function getValue(s,key) {eval(~"jsonobj=~" + s); return eval(~"jsonobj.~" + key) ; }")

TRY
  // remove (replace with "") all the carriage return to clean up the JSON string
  int position, i
  FOR i = 1 to len(ls_response)
        position = pos(ls_response, "~n")
        IF position > 0 THEN
            ls_response= Replace(ls_response, position, 1, "")
        END IF
  NEXT
  MessageBox("JSON response cleanup", ls_response)
  // typical response
  //   { "time": "04:21:52 PM",  "milliseconds_since_epoch": 1436113312190, "date": "07-05-2015" }

   ls_value =  lole_ScriptControl.Eval ("getValue(' " + ls_response + " ',  'date');")
   MessageBox("date value", ls_value)
CATCH ( Throwable e )
   MessageBox("Err", e.GetMessage())
END TRY
Since the JSON string has quotes to represent strings, I use single quotes to pass the JSON string to the JScript function.

IMPORTANT NOTE

You have to make sure that the JSON string is valid and from a trusted source because this technique (using eval() and not a real JSON parser) is not safe and can be used to inject and execute malicious code.

See also this HowTo : Get a value from a JSON string.