Resty is designed as a client for a particular type of discoverable REST API; one that returns JSON, and where that JSON has particular keys which enable navigation of the data graph.
A GET made to:
http://fishy.fish/fish/123
Might return the following JSON:
{
':href': 'http://fishy.fish/fish/123',
'tag_number': '3987349834',
'name': 'Bob the Fish'
'species' => {
':href' => 'http://species.fish/species/555'
},
'habitat' => {
':href' => 'http://fishy.fish/oceans/atlantic',
'name' => 'Atlantic Ocean'
'size' => 'quite large'
}
}
-
The ':href' indicates the URL this resource is available at. In this case the URL is the one we requested, which is the normal case.
-
The 'species' key is a link to another resource. If a GET is made to that URL, more information about that species will be available. No other information about the species is available without doing that extra request. It's also on a different domain, which doesn't matter to Resty at all.
-
The 'habitat' key is an example of a link containing the information you'll find at the link; this means that it's not necessary to do the extra request. Generally this is done if it's always known that the related resources will be required.
Given the above resource, you could execute the following code in IRB:
ruby-1.9.2-p180 :001 > require 'resty'
=> true
ruby-1.9.2-p180 :002 > fish = Resty.href('http://fishy.fish/fish/123')
=> #<Resty:0xa5ba70c ...>
At this stage, no requests will be made. Once you start look at the properties of "fish", a request will be made to GET the resource.
ruby-1.9.2-p180 :003 > fish.name
=> "Bob the Fish"
ruby-1.9.2-p180 :004 > fish.habitat
=> #<Resty:0xa590a24 ...>
ruby-1.9.2-p180 :005 > fish.habitat.name
=> "Atlantic Ocean"
Looking at "habitat" didn't require extra requests (because the data for "habitat" was already populated in the first request), but looking at "species" will require us to fetch that resource. Let's assume that the species GET returns the following JSON:
{
':href' => 'http://species.fish/species/555',
'commonName' => 'Atlantic Salmon',
'scientificName' => 'Salmo salar'
'kingdom' => {
':href' => 'http://species.fish/kingdom/223'
}
}
Then the following will happen; notice that "common_name" is translated to "commonName".
ruby-1.9.2-p180 :006 > fish.species.common_name
=> "Atlantic Salmon"
Now assume that the kingdom GET returns something sensible; we can do the following, chaining our method calls:
ruby-1.9.2-p180 :007 > fish.species.kingdom.scientific_name
=> "Animalia"