source 'http://rubygems.org'
gem 'grape'
gem 'grape-roar'Run bundle install.
Create api.rb.
class Api < Grape::API
format :json
desc 'Root of the Hypermedia API.'
get do
{ foo: 'bar' }
end
endCreate config.ru.
$LOAD_PATH.unshift(File.dirname(__FILE__))
require 'rubygems'
require 'bundler/setup'
Bundler.require :default
require 'api'
run ApiRun rackup, browse to http://localhost:9292, see the API.
Add activemodel to Gemfile.
gem 'activemodel', require: 'active_model'Create models/spline.rb.
class Spline
include ActiveModel::Model
attr_accessor :uuid
attr_accessor :reticulated
def initialize(attrs = { reticulated: [true, false].sample })
super(attrs)
@uuid ||= SecureRandom.uuid
@reticulated = !!attrs[:reticulated]
end
end resource :splines do
desc 'Return a spline.'
get ':uuid' do
Spline.new(uuid: params[:uuid])
end
endMake a presenter.
module SplinePresenter
include Roar::Representer::JSON::HAL
include Roar::Representer::Feature::Hypermedia
include Grape::Roar::Representer
property :uuid
property :reticulated
link :self do
"http://localhost:9292/splines/#{uuid}"
end
endRequire JSON+HAL.
require 'roar/representer'
require 'roar/representer/json'
require 'roar/representer/json/hal'
require 'presenters/spline_presenter'Present the spline.
present Spine.new(uuid: params[:uuid]), with: SplinePresenterSee it at http://localhost:9292/splines/123.
Create a presenters/splines_presenter.rb.
module SplinesPresenter
include Grape::Roar::Representer
include Roar::Representer::JSON::HAL
include Roar::Representer::Feature::Hypermedia
collection :to_a, extend: SplinePresenter, as: :splines, embedded: true
endRequire it.
require 'presenters/splines_presenter'Present splines.
desc 'Return a few splines.'
get do
present 5.times.map { Spline.new }, with: SplinesPresenter
endCreate presenters/root_presenter.rb.
module RootPresenter
include Roar::Representer::JSON::HAL
include Roar::Representer::Feature::Hypermedia
include Grape::Roar::Representer
link :self do
"http://localhost:9292"
end
link :splines do
"http://localhost:9292/splines"
end
link :spline do |opts|
{
href: "http://localhost:9292/splines/{uuid}",
templated: true
}
end
endRequire it.
require 'presenters/root_presenter'Present it.
desc 'Root of the Hypermedia API.'
get do
present self, with: RootPresenter
endrequire 'hyperclient'
client = Hyperclient.new('http://localhost:9292')
client.splines.count
client.splines.each do |spline|
puts "Spline #{spline.uuid} is #{spline.reticulated ? 'reticulated' : 'not reticulated'}."
end