ODS.VirtuosoOdsControllersClientApi

Simple Client Written in VSP


<html>
<?vsp
    declare consumer_key, consumer_secret, oauth_token, oauth_secret, signature, timest, nonce varchar;
    declare srv, res, signature_base, ret_url, url, tmp, sid varchar;
    declare meth, pars any;
    consumer_key := {?'key'};
    srv := sprintf ('http://localhost:%s/OAuth/', server_http_port ());
    sid := null;
    res := '';

    sid :=  {?'sid'};
    if (sid = '')
      sid := null;  
    else
      {
        -- if selected token is not same as one from the session we need to get new authentication token
        if (consumer_key <> OAUTH..get_consumer_key (sid))
     {
       OAUTH..session_terminate (sid);
            sid := null;
     }
      }

    meth := get_keyword ('meth', params, 'weblog.post.new');;
    pars := get_keyword ('pars', params, 'inst_id=15&title=testing&description=Some test post');;

    if ({?'rt'} is not null and sid is null) -- request new token for the session
      {
   url := srv||'request_token';
   url := OAUTH..sign_request ('GET', url, '', consumer_key, sid);
        res := http_get (url);
   sid := OAUTH..parse_response (sid, consumer_key, res);
   OAUTH..set_session_data (sid, params);
   ret_url := sprintf ('http://localhost:%s/oauth/oauth_client.vsp?ready=%U', server_http_port (), sid);
   -- call authorize
        url := sprintf ('%sauthorize?oauth_token=%U&oauth_callback=%U', srv, OAUTH..get_auth_token (sid), ret_url);
   http_status_set (301);
        http_header (sprintf ('Location: %s\r\n', url));
        return;
      }
    else if ({?'ready'} is not null) -- get access token
      {
   -- we go here when token above is authorized
        sid := {?'ready'};
   url := srv||'access_token';
   consumer_key := OAUTH..get_consumer_key (sid);
   url := OAUTH..sign_request ('GET', url, '', consumer_key, sid);
        res := http_get (url);
   sid := OAUTH..parse_response (sid, consumer_key, res);

      }
    if (sid is not null) -- access token is ready, and we can call API
      {
        -- here we are ready to call service
   if ({?'rt'} is null)
          {
            tmp := OAUTH..get_session_data (sid);
            pars := get_keyword ('pars', tmp, pars);
       meth := get_keyword ('meth', tmp, meth);
     }
   url := sprintf ('http://localhost:%s/ods/api/%s', server_http_port (), meth);
   tmp := split_and_decode (pars);
   params := '';
   for (declare i,l int, l:=length (tmp); i < l; i := i + 2)
      {
        params := params || sprintf ('%U=%U&', tmp[i], tmp[i+1]);
      }
   --params := sprintf ('inst_id=%d&description=%U&title=%U', 15, 'Some test post', 'testing');
   consumer_key := OAUTH..get_consumer_key (sid);
   url := OAUTH..sign_request ('GET', url, params, consumer_key, sid);
        res := http_get (url);
        --dbg_obj_print (res);
      }
?>
    <head><title>OAuth Client</title></head>
    <body>
   <h1>OAuth client for ODS Controllers</h1>
   <form method="POST" action="oauth_client.vsp">
   <input type="hidden" name="sid" value="<?V sid ?>"/>
   APPLICATION : <br/> <select name="key">
   <?vsp for select a_name, a_key from OAUTH..APP_REG do { ?>
            <option value="<?V a_key ?>" <?vsp if (consumer_key = a_key) http ('selected'); ?>><?V a_name ?></option>
   <?vsp } ?>
              </select>
   <?vsp
   if (sid is not null) http (sprintf (' TOKEN: %s', OAUTH..get_auth_token (sid)));
   ?>
   <br/>
   ODS API: <br/><input type="text" name="meth" value="<?V meth ?>" size=50/> <br/>
   PARAMETERS: <br/> <textarea name="pars" rows="5" cols="50"><?V pars ?></textarea> <br/>
        <input type="submit" value="Execute" name="rt"/><br/>
   </form>
   RESULT:
   <hr/>
   <pre><?V res ?></pre>
    </body>
</html>