22. Good API
• Proper status codes
• Compatibility (?suppress_response_code=true)
• Metadata
23. class Responder
class << self
def call(env)
req = ::Rack::Request.new(env)
instance = new(req)
instance.call
instance.to_rack_array
end
end
attr_reader :request, :params, :headers
def initialize(req)
@request = req
@params = req.params
@headers = default_response_headers
end
def call; end
def to_rack_array
[http_response_code, http_response_headers, http_response_body]
end
end
24. class Responder
def response_code
@response_code || default_response_code
end
private
def default_response_code
200
end
def http_response_code
params['suppress_response_codes'] ? 200 : response_code
end
end
30. class Write < Responder
def call
@body = valid_params? ? success : failure
end
private
def success; end
def failure; end
def valid_params?
true
end
end
31. class CreateUser < Write
def default_response_code
201
end
def valid_params?
params['login'] && params['email']
end
def success
DB[:users].insert(params)
end
def failure
@response_code = 400
{ error: 'Invalid params' }
end
end
32. class Responder
def body
{
code: http_response_code,
result: @body,
meta: meta
}
end
def meta
{
server_time: Time.now.to_i
}
end
end
41. Questions?
Credits and attributions:
• Title illustration by Max Bohdanowski
• Lobster Two font by Pablo Impallari & Igino Marini (OFL)
• Font Awesome by Dave Gandy - http://fontawesome.io (OFL)
• https://www.flickr.com/photos/mattsh/14194586111/ (CC BY-NC-SA 2.0)
Andriy Savchenko /ptico
andriy@aejis.eu