When using Ruby, there are many options for what client to use. The one demonstrated below uses the rest-client gem.
#!/usr/bin/env ruby
require 'rubygems'
require 'rest_client'
require 'json'
$base_uri = 'https://my_server/webacs/api/v4'
$user, $pass = 'user', 'password'
$clients ='/data/ClientDetails'
# wrap resource access
class PagedResource
def initialize(url, extraQuery, user, password,ps)
@resource = RestClient::Resource.new url, :user => user, :password => password, :verify_ssl => false
@options = {:accept => 'application/json'};
@extra = URI.encode(extraQuery);
@pagesize=ps;
end
def getPage(start)
query = URI.encode('?.full=true&.firstResult='+ start.to_s+ '&.maxResults=' +@pagesize.to_s) + '&'+@extra;
puts "Query: " + query;
res = @resource[query].get @options
if (res.code != 200)
raise "Bad response received:",res.to_str
exit
end
last_res = JSON.parse(res)
return last_res;
end
def getComplete()
resList =[];
start = Time.new
partial = getPage(0);
count = partial['queryResponse']['@count'].to_i;
last = partial['queryResponse']['@last'].to_i;
if (count == 0)
puts ("Read 0 records")
return resList;
end
rumble resList, partial
while last<count-1 do
partial = getPage(last+1);
last = partial['queryResponse']['@last'].to_i;
rumble resList, partial
end
finish = Time.new
puts ("Read "+resList.length.to_s+" records")
puts ('Took: '+(finish-start).to_i.round().to_s+' seconds')
return resList;
end
private
def rumble(resA,partial)
partial['queryResponse']['entity'].each do | ent|
dto = ent['@dtoType']
resA.push(ent[dto])
end
end
end
clientRes = PagedResource.new $base_uri + $clients,"",$user, $pass, 1000;
clients = clientRes.getComplete();
puts(JSON.pretty_generate(clients[0]))