You are here: Browse Railsplugins Active Resource
= Active Resource—Object-oriented REST services
Active Resource (ARes) connects business objects and REST web services. It is a library intended to provide transparent proxying capabilities between a client and a RESTful service (for which Rails provides the {Simply RESTful routing}[http://dev.rubyonrails.org/browser/trunk/actionpack/lib/action_controller/resources.rb] implementation).
=== Configuration & Usage
Configuration is as simple as inheriting from ActiveResource::Base and providing a site class variable:
class Person < ActiveResource::Base
self.site = "http://api.people.com:3000/"
end
Person is now REST enable and can invoke REST services very similarly to how ActiveRecord invokes lifecycle methods that operate against a persistent store.
=== Protocol
ARes is built on a standard XML format for requesting and submitting resources. It mirrors the RESTful routing built into ActionController, though it’s useful to discuss what ARes expects outside the context of ActionController as it is not dependent on a Rails-based RESTful implementation.
==== Find
GET Http requests expect the XML form of whatever resource/resources is/are being requested. So, for a request for a single element – the XML of that item is expected in response:
The XML document that is received is used to build a new object of type Person, with each XML element becoming an attribute on the object.
ryan.is_a? Person #=> true
ryan.attribute1 #=> 'value1'
Any complex element (one that contains other elements) becomes its own object:
Collections can also be requested in a similar fashion
==== Create
Creating a new resource submits the xml form of the resource as the body of the request and expects a ‘Location’ header in the response with the RESTful URL location of the newly created resource. The id of the newly created resource is parsed out of the Location response header and automatically set as the id of the ARes object.
==== Update
‘save’ is also used to update an existing resource – and follows the same protocol as creating a resource with the exception that no response headers are needed – just an empty response when the update on the server side was successful.
==== Delete
Destruction of a resource can be invoked as a class and instance method of the resource.
=== Errors & Validation
Error handling and validation is handled in much the same manner as you’re used to seeing in ActiveRecord. Both the response code in the Http response and the body of the response are used to indicate that an error occurred.
==== Resource errors
When a get is requested for a resource that does not exist, the Http ‘404’ (resource not found) response code will be returned from the server which will raise an ActiveResource::ResourceNotFound exception.
==== Validation errors
Creating and updating resources can lead to validation errors – i.e. ‘First name cannot be empty’ etc… These types of errors are denoted in the response by a response code of 422 and the xml representation of the validation errors. The save operation will then fail (with a ‘false’ return value) and the validation errors can be accessed on the resource in question.
==== Response errors
If the underlying Http request for an ARes operation results in an error response code, an exception will be raised. The following Http response codes will result in these exceptions:
200 - 399: Valid response, no exception
404: ActiveResource::ResourceNotFound
409: ActiveResource::ResourceConflict
422: ActiveResource::ResourceInvalid (rescued by save as validation errors)
401 - 499: ActiveResource::ClientError
500 - 599: ActiveResource::ServerError
=== Authentication
Many REST apis will require username/password authentication, usually in the form of Http authentication. This can easily be specified by putting the username and password in the Url of the ARes site:
class Person < ActiveResource::Base
self.site = "http://ryan:password@api.people.com:3000/"
end
For obvious reasons it is best if such services are available over https.
NOTE: This description has been extracted from the Plugin README and so the formatting may need updating to make browser friendly