A Ruby library for interacting with external JSON services
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.



This gem is an internal LVS project for communicating with an AGP (Advanced Gaming Platform) backend server.


In the old days there was the WebApi classes which used XML-RPC. Then there was the ‘new’ ABP::API::JSN class (why JSON is abbreviated to JSN is unknown) which has all the JSON API calls in one class.

This felt very un-Railsy, so Andy Jeffries wrote the new JsonService parent class, so we can treat each group of JSON services like a model. This is similar to the way ActiveResource works (but we can’t use ActiveResource as our models aren’t really resources).


As a simple example of how to create a new model based JSON API class:

require 'json_service'

class Event < LVS::JsonService::Base
  self.site = AGP_LOCATION + '/jsonservices/'
  self.service_prefix = 'com.lvsint.abp.client.json.commands.'
  self.field_prefix = 'event_'
  define_service :special, 'DoSomethingSpecial.json', 
    :defaults => {:n => 5}, :required => [:n, :locale]
  define_service :details, 'ListAllEvents.json',
    :defaults => {:searchType => Event::SEARCH_TYPE_IDS}, 
    :required => [:searchType, :searchIds],
    :optional => [:locale, :period, :includeEventInfoYN]


You then use it just like an ActiveRecord model (at the moment it’s read only – we’ll add write capabilities to it in an ActiveRecord style when we need them):

events = Event.special :locale => "en-gb"
events.each do |event|
  puts "#{event.id} #{event.title}"

The field names come from the JSON return field names after the field_prefix is stripped off (if present).

There is also a bit of magic that converts fields ending in ‘date’ to be a Time value, and fields starting with has_ such as has_bets to return a boolean (and create a bets? method too).

Combined results

The first version of json_service only worked if the result was an array of hashes. The latest version will now accept a hash as the result and make any elements that have arrays as the values an array of objects. For example, given the JSON as follows:

  'event_id': 132,
  'event_location': 'Anfield, Liverpool, England',
  'teams': [
      'name': 'Liverpool',
      'colour': 'Red'
      'name': 'Everton',
      'colour': 'Blue'

You could then use the class in this way:

event = Event.my_combined_call :locale => "en-gb"
puts "ID: " + event.id
puts "Location: " + event.location
events.teams.each do |team|
  puts "#{team.name}(#{event.colour})"

Faking calls

There are times when you’re ready to develop on the Rails side but the Web API isn’t ready. You can create a fake service that just parses a hard-coded JSON string in the same way as it would if it had come back from the Web API.

class Event < LVS::JsonService::Base
  self.site = AGP_LOCATION + '/jsonservices/'
  self.service_prefix = 'com.lvsint.abp.client.json.commands.'
  self.field_prefix = 'event_'
  fake_service :special, '{"status":"OK", "count":2}'

Communication Resiliancy

The AGP backend doesn’t always reliably allow a connection and prompt response. Therefore there is now the facility to define a timeout for a connection (and response) and an amount of retries rather than immediately failing.

The new parameters are defined as per the following example:

  define_service :last_minute, 'FDJListLastMinuteEventsService.json', 
    :defaults => {:n => 5}, :required => [:n, :locale], :timeout => 3, :retries => 3

The default values are 1 second timeout (note: this is actually 1 second connection timeout and 1 second read timeout, so 2 seconds total) and 0 retries.

If it fails to connect or times out, it retries :retries times with timeout set to :timeout + 50%.

Copyright © 2009-2010 LVS Ltd.