api.rb
module MyApp
module API
class Railtie < Rails::Railtie
class Command
attr_accessor :user
def initialize(user = nil)
@user = user || User.first
end
%i(get post patch put delete head).each do |method|
define_method(method) do |path, parameters = {}, headers_or_env = {}|
app.__send__ method, path, default_params.merge(parameters), default_headers.merge(headers_or_env)
ActiveSupport::JSON.decode app.response.body
end
end
private
def default_params
{}.tap do |h|
h[:api_key] = @user.api_key if @user
end
end
def default_headers
{}.tap do |h|
h['Accept'] = 'application/json'
end
end
def app
TOPLEVEL_BINDING.eval('app')
end
end
module ClassMethods
def api
@api ||= Command.new
end
end
console do
TOPLEVEL_BINDING.eval('self').extend ClassMethods
end
end
end
end
console
api.get 'users' #=> [{"id"=>1, "name"=>"foo"}, {"id"=>2, "name"=>"bar"}]
api.user = nil
api.get 'users' #=> {"status"=>401, "message"=>"Unauthorized"}
api_key はそれぞれのサービスの認証に必要なパラメータ名に変えてください。