ReSTful API's done right (with Rails)

689aaa70b7ade5fe2e9b0cc5289d6069?s=47 Jonathan Dinu
September 20, 2012

ReSTful API's done right (with Rails)


Jonathan Dinu

September 20, 2012


  1. ReST!   What  is  is  good  for?  

  2. Absolutely  Nothing!  

  3. Just  kidding…     web  apps  is  the  correct  answer

     good  sirs  and  ladies  
  4. Because  you  can  dynamically  load   Clip  art  into  your

     sweet  website?  
  5. •  It  decouples  server  logic  from  client  logic   • 

    Allows  mulEple  clients  to  consume  the  one   API:  Mobile,  web,  server-­‐server   •  Allows  asynchronous  UI  that  dynamically   updates  with  Ajax.    Like  real-­‐Eme  shit.    
  6. So  how  do  I  do  this  ReST  thing?   With

     Rails  of  course!?!     •  Base  URI  (hQp://   •  Media  type  (i.e.  only  JSON)   •  Set  of  HTTP  methods/verbs  (GET  me  some  toast!)   •  HATEOAS  (gonna  hateTM)   Four  commandments  of  ReST  
  7. •  Limit  routes   •  Remove  AcEveResource   •  Tailor

     Middleware   •  Custom  (metal)  Controller  
  8. scope  "/api/v1"  do              

       scope  ”/sweet_cat_pictures"  do                          post  "/"  =>  ”cats#create”                          get  "/"  =>  ”cats#index"                          get  ”:cat_id"  =>  “cats#show”                          put  ”:cat_id"  =>  ”cats#update"                  end   end  
  9. #  config/applicEon.rb   require  "rails"     %w(    

     acEve_record      acEon_controller      acEon_mailer   ).each  do  |framework|              begin    require  "#{framework}/railEe"              rescue  LoadError              end   end   Instead  of  require  “rails/all”  
  10. class  ApplicaEonController  <  AcEonController::Metal            

     include  AbstractController::Logger              include  Rails.applicaEon.routes.url_helpers              include  AcEonController::UrlFor              include  AcEonController::Rendering              include  AcEonController::Renderers::All              include  AcEonController::MimeResponds              …   end   *applica'on  specific  
  11. class  CatsController  <  ApplicaEonController            

     def  show    render  :json  =>  Cat.find(params[:cat_id])              end   end  
  12. #  spec/requests/api_spec.rb   require  'spec_helper'     describe  "api"  do

                 describe  "GET  /api/v1/cats/:cat_id"  do          it  "returns  a  json  hash  with  the  proper  data"  do                    get  "/api/v1/cats/mildred"            AcEveSupport::JSON.decode(response.body).should  ==  {        "id"  =>  ”mildred”,      “photo_url”  =>  “hQp://”    }    end              end  
  13. •  gem  install  rails-­‐api   •  Rails-­‐on-­‐rack  (hQp://   • 

    From  our  friends  at  Pivotal  (hQp://   •  Thank  you  Mr.  Fielding  (hQp://  
  14. None