SlideShare ist ein Scribd-Unternehmen logo
1 von 44
Downloaden Sie, um offline zu lesen
REST & Rails
Web Services for the Rails World
      Rein Henrichs http://reinh.com
self.werewolf? # => false
REST & Rails
•   What Is REST?
•   Make Rails RESTful
•   Eating RESTfully
•   RESTful Tips & Tricks
•   RESTful Resources
What is REST?

Representational

State

Transfer

Of Resources
Resources
•   Sources of specific information
•   Identified by a global identifier (URI)
•   Hyperlinked to other resources
•   Examples:
    •   del.icio.us tags, links
    •   Amazon S3 buckets
    •   flickr photos
    •   blog posts
    •   twitters
    •   (Nearly) everything else on the internet
Resources

•   Things
•   With names
•   That often relate to other things
•   On the internet
Representations

•   Formats
    • HTML, XML, JSON, JPG, SVG, etc.

•   Content Types (MIME Types)
    • text/html, application/xml, etc.
State


•   Resource state, not application state
•   Often database backed (CRUD)
Transfer
•   Use HTTP Verbs
    • (Constraints are liberating)

•   Design a Uniform Interface
    • Simple, Visible, Reusable

•   Stateless
•   Manipulate resources by transferring
    representations
Transfer
RESTless               RESTful
VERB   HREF            VERB   URI
POST   /users/create   POST   /users

GET    /users/1        GET    /users/1

POST   /users/1/update PUT    /users/1

????   /users/1/delete DELETE /users/1
Make Rails RESTful

• Design your Resources
• Create their Representations
• Expose them
• Profit!
Design Your Resources
 •   Identify your resources
 •   Design a URI scheme

     Entity    URI
     User      /users/quentin

     Photo     /photos/grand-canyon

     Comment   /photos/grand-canyon/comments/1


 •   In rails: map.resources
map.resources
  maps URIs to controllers
 maps HTTP verbs to actions
    map.resources :users
Resource   Verb     Action
/users     GET      index
/users     POST     create
/users/1   GET      show
/users/1   PUT      update
/users/1   DELETE   destroy
Design Your Resources
              Caveat Implementor


HTML and XHTML currently only support two HTTP verbs:
GET and POST. In order to get around this limitation, Rails
uses overloaded POST requests with a _method parameter
to simulate PUT and DELETE requests. Rails handles this
transparently through its view helpers and resource routing.
Create Representations
  Which formats will you provide?


 • User      • Photo     • Comment
  • HTML      • HTML      • XML
  • XML       • XML       • JSON
  • JSON      • JPG
  • vCard?    • Sizes?
Expose Resources
•   Determine the requested resource
•   Determine the requested representation
•   Manipulate the resource’s state based
    on the request method and parameters
•   Deliver an acceptable representation of
    the resource’s (new) state
Expose Resources
Determine the requested resource

•   Resources are identified by URIs
    • “Uniform Resource Indicator”

•   Rails maps URIs to controllers and
    actions
    • map.resources :users
Expose Resources
Determine the requested representation



 •   “Accept” header
 •   params[:format]
     • users/1.xml
Expose Resources
Manipulate the resource’s state (Rails 101)
   • Create the resource
    @user = User.new(params[:user])
    @user.save

   • Retrieve the resource
    @user = User.find(params[:id])

   • Update the resource
    @user.update_attributes(params[:user])

   • Delete the resource
    @user.destroy
Expose Resources
       Deliver a representation

• Based on Accept header
  def index
    @users = User.find(:all)

    respond_to do   |format|
      format.html   # text/html, application/xhtml+xml
      format.xml    # application/xml
      format.js     # text/javascript
    end
  end
Expose Resources
       Deliver a representation

• Based on format
  def index
    @users = User.find(:all)

    respond_to do   |format|
      format.html   # index
      format.xml    # index.xml
      format.js     # index.js
    end
  end
Expose Resources
       Deliver a representation

• Using templates
  def index
    @users = User.find(:all)

    respond_to do   |format|
      format.html   # index.html.erb
      format.xml    # index.xml.builder or index.xml.erb
      format.js     # index.js.rjs or index.js.erb
    end
  end
Expose Resources
       Deliver a representation

• Using coercion
  def index
    @users = User.find(:all)

    respond_to do |format|
      format.html # N/A
      format.xml { render :xml => @users.to_xml }
      format.js { render :text => @users.to_json }
    end
  end
Expose Resources
         Deliver a representation


•   Using Rails scaffold generator*
    • ruby script/generate scaffold User
    • Creates CRUD and index actions that map
      resources to an ActiveRecord model and
      respond to html and xml




       * edge rails / Rails 2.0 (scaffold_resource in 1.2.x)
Eating RESTfully


•   ActiveResource
•   Alternatives
Eating RESTfully
             ActiveResource

•   Designed to consume RESTful web
    services via XML
•   Treats resources as models
•   Fairly strict about resource architecture
•   Some examples please?
Eating RESTfully
                 ActiveResource
•   Consuming our users
    class User < ActiveResource::Base
      self.site = quot;http://www.example.comquot;
    end
    >> User.find(:all) # users.xml
    >> User.find(1) # users/1.xml


•   Consuming our photos
    class Photo < ActiveResource::Base
      self.site = quot;http://www.example.comquot;
    end
Eating RESTfully
           Alternatives



• rest-open-uri
• JQuery.getJSON()
Eating RESTfully
gem install rest-open-uri

•   Wraps Bare metal Net::HTTP library
•   Extends open-uri to allow PUT, POST,
    and DELETE
•   Some examples please?
    • http://pastie.caboo.se/117513
Eating RESTfully
         JQuery.getJSON()

•   Asynchronous HTTP request for text/
    javascript

•   JSON object can be passed to
    anonymous function
•   Some examples please?
Eating RESTfully
                    JQuery.getJSON()
var flickr_cats_uri = quot;http://api.flickr.com/services/feeds/photos_public.gne?
tags=cat&tagmode=any&format=json&jsoncallback=?quot;


$.getJSON(flickr_cats_uri, function(data){
  $.each(data.items, function(i,item){
    $(quot;<img/>quot;).attr(quot;srcquot;, item.media.m).appendTo(quot;#imagesquot;);
    if ( i == 3 ) return false;
  });
});
RESTful Tips & Tricks

•   DRY ActiveResource
•   DRY RESTful Controllers
•   Turn verbs into nouns
•   Custom MIME types
RESTful Tips
             DRY ActiveResource


•   Consuming our users
    class User < ActiveResource::Base
      self.site = quot;http://www.example.comquot;
    end


•   Consuming our photos
    class Photo < ActiveResource::Base
      self.site = quot;http://www.example.comquot;
    end
RESTful Tips
             DRY ActiveResource


•   Create a base class
    class ExampleSite < ActiveResource::Base
      self.site = quot;http://www.example.comquot;
    end


•   Consuming our users and photos
    class User < ExampleSite; end
    class Photo < ExampleSite; end
RESTful Tips
            DRY RESTful Controllers



•   resource_controller plugin
    class PostsController < ResourceController::Base
    end
    http://jamesgolick.com/resource_controller/rdoc/index.html
RESTful Tips
               Turn Verbs into Nouns
Replace RPC* style overloaded POST interfaces with resources that
  respond to a Uniform Interface by using standard HTTP verbs


 Method                          Overloaded POST
 User.find(1).activated?         GET users/1?q=activated

 User.find(1).activate!          POST users/1?m=activate

 User.find(1).deactivate! POST users/1?m=deactivate


                      * Remote Procedure Call
RESTful Tips
               Turn Verbs into Nouns
Replace RPC* style overloaded POST interfaces with resources that
  respond to a Uniform Interface by using standard HTTP verbs


 Method                          Uniform Interface
 User.find(1).activated?         GET users/1/activation

 User.find(1).activate!          POST users/1/activation

 User.find(1).deactivate! DELETE users/1/activation


                      * Remote Procedure Call
RESTful Tips
          Custom MIME Types


Mime::Type.register quot;image/pngquot;, :png
Mime::Type.register quot;text/x-vcardquot;, :vcard
RESTful Resources
RESTful Web
  Services
 http://www.oreilly.com/
catalog/9780596529260/
Peepcode:
 REST Basics
    http://nubyonrails.com/
articles/peepcode-rest-basics
Fielding
Dissertation:
 Chapter 5
  http://www.ics.uci.edu/
~fielding/pubs/dissertation/
    rest_arch_style.htm
These Slides
http://reinh.com/2007/11/13/
           rest-rails
“My God, it’s full of resources!”

Weitere ähnliche Inhalte

Was ist angesagt?

RESTful Web Services with Jersey
RESTful Web Services with JerseyRESTful Web Services with Jersey
RESTful Web Services with JerseyScott Leberknight
 
Rails Routing and URL design
Rails Routing and URL designRails Routing and URL design
Rails Routing and URL designhiq5
 
Service approach for development Rest API in Symfony2
Service approach for development Rest API in Symfony2Service approach for development Rest API in Symfony2
Service approach for development Rest API in Symfony2Sumy PHP User Grpoup
 
Rails 3 - The Developers Conference - 21aug2010
Rails 3 - The Developers Conference - 21aug2010Rails 3 - The Developers Conference - 21aug2010
Rails 3 - The Developers Conference - 21aug2010Plataformatec
 
CakeFest 2013 - A-Z REST APIs
CakeFest 2013 - A-Z REST APIsCakeFest 2013 - A-Z REST APIs
CakeFest 2013 - A-Z REST APIsanthony_putignano
 
REST Easy with AngularJS - ng-grid CRUD EXAMPLE
REST Easy with AngularJS - ng-grid CRUD EXAMPLEREST Easy with AngularJS - ng-grid CRUD EXAMPLE
REST Easy with AngularJS - ng-grid CRUD EXAMPLEreneechemel
 
So various polymorphism in Scala
So various polymorphism in ScalaSo various polymorphism in Scala
So various polymorphism in Scalab0ris_1
 
Dethroning Grunt: Simple and Effective Builds with gulp.js
Dethroning Grunt: Simple and Effective Builds with gulp.jsDethroning Grunt: Simple and Effective Builds with gulp.js
Dethroning Grunt: Simple and Effective Builds with gulp.jsJay Harris
 
Differential Sync and JSON Patch @ SpringOne2GX 2014
Differential Sync and JSON Patch @ SpringOne2GX 2014Differential Sync and JSON Patch @ SpringOne2GX 2014
Differential Sync and JSON Patch @ SpringOne2GX 2014Brian Cavalier
 
The JSON REST API for WordPress
The JSON REST API for WordPressThe JSON REST API for WordPress
The JSON REST API for WordPressTaylor Lovett
 
Pourquoi ruby et rails déchirent
Pourquoi ruby et rails déchirentPourquoi ruby et rails déchirent
Pourquoi ruby et rails déchirentNicolas Ledez
 
Hanoi php day 2008 - 05. nguyen hai nhat huy - building-restful-web-service-w...
Hanoi php day 2008 - 05. nguyen hai nhat huy - building-restful-web-service-w...Hanoi php day 2008 - 05. nguyen hai nhat huy - building-restful-web-service-w...
Hanoi php day 2008 - 05. nguyen hai nhat huy - building-restful-web-service-w...Nguyen Duc Phu
 
RESTful Web Services with JAX-RS
RESTful Web Services with JAX-RSRESTful Web Services with JAX-RS
RESTful Web Services with JAX-RSCarol McDonald
 

Was ist angesagt? (18)

RESTful Web Services with Jersey
RESTful Web Services with JerseyRESTful Web Services with Jersey
RESTful Web Services with Jersey
 
Rails Routing and URL design
Rails Routing and URL designRails Routing and URL design
Rails Routing and URL design
 
Service approach for development Rest API in Symfony2
Service approach for development Rest API in Symfony2Service approach for development Rest API in Symfony2
Service approach for development Rest API in Symfony2
 
Rails 3 - The Developers Conference - 21aug2010
Rails 3 - The Developers Conference - 21aug2010Rails 3 - The Developers Conference - 21aug2010
Rails 3 - The Developers Conference - 21aug2010
 
CakeFest 2013 - A-Z REST APIs
CakeFest 2013 - A-Z REST APIsCakeFest 2013 - A-Z REST APIs
CakeFest 2013 - A-Z REST APIs
 
REST Easy with AngularJS - ng-grid CRUD EXAMPLE
REST Easy with AngularJS - ng-grid CRUD EXAMPLEREST Easy with AngularJS - ng-grid CRUD EXAMPLE
REST Easy with AngularJS - ng-grid CRUD EXAMPLE
 
Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
 
So various polymorphism in Scala
So various polymorphism in ScalaSo various polymorphism in Scala
So various polymorphism in Scala
 
AJAX - An introduction
AJAX - An introductionAJAX - An introduction
AJAX - An introduction
 
Dethroning Grunt: Simple and Effective Builds with gulp.js
Dethroning Grunt: Simple and Effective Builds with gulp.jsDethroning Grunt: Simple and Effective Builds with gulp.js
Dethroning Grunt: Simple and Effective Builds with gulp.js
 
Differential Sync and JSON Patch @ SpringOne2GX 2014
Differential Sync and JSON Patch @ SpringOne2GX 2014Differential Sync and JSON Patch @ SpringOne2GX 2014
Differential Sync and JSON Patch @ SpringOne2GX 2014
 
The JSON REST API for WordPress
The JSON REST API for WordPressThe JSON REST API for WordPress
The JSON REST API for WordPress
 
HTML5 - An introduction
HTML5 - An introductionHTML5 - An introduction
HTML5 - An introduction
 
Pourquoi ruby et rails déchirent
Pourquoi ruby et rails déchirentPourquoi ruby et rails déchirent
Pourquoi ruby et rails déchirent
 
Introduction to JavaScript
Introduction to JavaScriptIntroduction to JavaScript
Introduction to JavaScript
 
Maven in Mule
Maven in MuleMaven in Mule
Maven in Mule
 
Hanoi php day 2008 - 05. nguyen hai nhat huy - building-restful-web-service-w...
Hanoi php day 2008 - 05. nguyen hai nhat huy - building-restful-web-service-w...Hanoi php day 2008 - 05. nguyen hai nhat huy - building-restful-web-service-w...
Hanoi php day 2008 - 05. nguyen hai nhat huy - building-restful-web-service-w...
 
RESTful Web Services with JAX-RS
RESTful Web Services with JAX-RSRESTful Web Services with JAX-RS
RESTful Web Services with JAX-RS
 

Andere mochten auch

sõnad
sõnadsõnad
sõnadkatal1
 
Plan De Trabajo Por Competencias
Plan De  Trabajo Por  CompetenciasPlan De  Trabajo Por  Competencias
Plan De Trabajo Por Competenciasnerysilva
 
Liitsona4kl
Liitsona4klLiitsona4kl
Liitsona4klmarytt
 
Fotografii Ramase In Istorie
Fotografii Ramase In IstorieFotografii Ramase In Istorie
Fotografii Ramase In Istoriebordeanu.anca
 
Efficient Software Development with Visual Studio Team System 2008
Efficient Software Development with Visual Studio Team System 2008Efficient Software Development with Visual Studio Team System 2008
Efficient Software Development with Visual Studio Team System 2008richardbushnell
 
U5 T1 Nereyda Mayra David
U5  T1  Nereyda Mayra DavidU5  T1  Nereyda Mayra David
U5 T1 Nereyda Mayra Davidnerysilva
 
Miroshnik Lv School8
Miroshnik Lv School8Miroshnik Lv School8
Miroshnik Lv School8Lubamir
 
Convegno Cts Europa
Convegno Cts EuropaConvegno Cts Europa
Convegno Cts Europactseuropa
 

Andere mochten auch (14)

Keresztseg
KeresztsegKeresztseg
Keresztseg
 
sõnad
sõnadsõnad
sõnad
 
Tiempos y ángulos
Tiempos y ángulosTiempos y ángulos
Tiempos y ángulos
 
Plan De Trabajo Por Competencias
Plan De  Trabajo Por  CompetenciasPlan De  Trabajo Por  Competencias
Plan De Trabajo Por Competencias
 
Ghiciti Contextul!
Ghiciti Contextul!Ghiciti Contextul!
Ghiciti Contextul!
 
Liitsona4kl
Liitsona4klLiitsona4kl
Liitsona4kl
 
Fotografii Ramase In Istorie
Fotografii Ramase In IstorieFotografii Ramase In Istorie
Fotografii Ramase In Istorie
 
R Osszefoglalo
R OsszefoglaloR Osszefoglalo
R Osszefoglalo
 
TIGERS
TIGERSTIGERS
TIGERS
 
U4 T2 A B P
U4  T2  A B PU4  T2  A B P
U4 T2 A B P
 
Efficient Software Development with Visual Studio Team System 2008
Efficient Software Development with Visual Studio Team System 2008Efficient Software Development with Visual Studio Team System 2008
Efficient Software Development with Visual Studio Team System 2008
 
U5 T1 Nereyda Mayra David
U5  T1  Nereyda Mayra DavidU5  T1  Nereyda Mayra David
U5 T1 Nereyda Mayra David
 
Miroshnik Lv School8
Miroshnik Lv School8Miroshnik Lv School8
Miroshnik Lv School8
 
Convegno Cts Europa
Convegno Cts EuropaConvegno Cts Europa
Convegno Cts Europa
 

Ähnlich wie Rest And Rails

Java colombo-deep-dive-into-jax-rs
Java colombo-deep-dive-into-jax-rsJava colombo-deep-dive-into-jax-rs
Java colombo-deep-dive-into-jax-rsSagara Gunathunga
 
WebCamp: Developer Day: Архитектура Web-приложений: обзор современных решений...
WebCamp: Developer Day: Архитектура Web-приложений: обзор современных решений...WebCamp: Developer Day: Архитектура Web-приложений: обзор современных решений...
WebCamp: Developer Day: Архитектура Web-приложений: обзор современных решений...GeeksLab Odessa
 
20120121 rbc rails_routing
20120121 rbc rails_routing20120121 rbc rails_routing
20120121 rbc rails_routingTakeshi AKIMA
 
Advanced RESTful Rails
Advanced RESTful RailsAdvanced RESTful Rails
Advanced RESTful RailsViget Labs
 
Advanced RESTful Rails
Advanced RESTful RailsAdvanced RESTful Rails
Advanced RESTful RailsBen Scofield
 
Restful webservices
Restful webservicesRestful webservices
Restful webservicesKong King
 
S313265 - Advanced Java API for RESTful Web Services at JavaOne Brazil 2010
S313265 - Advanced Java API for RESTful Web Services at JavaOne Brazil 2010S313265 - Advanced Java API for RESTful Web Services at JavaOne Brazil 2010
S313265 - Advanced Java API for RESTful Web Services at JavaOne Brazil 2010Arun Gupta
 
RailsスタイルからRESTを学ぼう よちがや.rb
RailsスタイルからRESTを学ぼう よちがや.rbRailsスタイルからRESTを学ぼう よちがや.rb
RailsスタイルからRESTを学ぼう よちがや.rbToru Kawamura
 
REST APIs in Laravel 101
REST APIs in Laravel 101REST APIs in Laravel 101
REST APIs in Laravel 101Samantha Geitz
 
Building RESTful applications using Spring MVC
Building RESTful applications using Spring MVCBuilding RESTful applications using Spring MVC
Building RESTful applications using Spring MVCIndicThreads
 
RESTFul WebApp Concept
RESTFul WebApp ConceptRESTFul WebApp Concept
RESTFul WebApp ConceptDian Aditya
 
RESTFul WebApp Concept
RESTFul WebApp ConceptRESTFul WebApp Concept
RESTFul WebApp ConceptDian Aditya
 
Rest with Java EE 6 , Security , Backbone.js
Rest with Java EE 6 , Security , Backbone.jsRest with Java EE 6 , Security , Backbone.js
Rest with Java EE 6 , Security , Backbone.jsCarol McDonald
 
RESTful Web Services with Spring MVC
RESTful Web Services with Spring MVCRESTful Web Services with Spring MVC
RESTful Web Services with Spring MVCdigitalsonic
 
Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson
Multi Client Development with Spring for SpringOne 2GX 2013 with Roy ClarksonMulti Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson
Multi Client Development with Spring for SpringOne 2GX 2013 with Roy ClarksonJoshua Long
 
Building Web Apps with Express
Building Web Apps with ExpressBuilding Web Apps with Express
Building Web Apps with ExpressAaron Stannard
 

Ähnlich wie Rest And Rails (20)

Java colombo-deep-dive-into-jax-rs
Java colombo-deep-dive-into-jax-rsJava colombo-deep-dive-into-jax-rs
Java colombo-deep-dive-into-jax-rs
 
WebCamp: Developer Day: Архитектура Web-приложений: обзор современных решений...
WebCamp: Developer Day: Архитектура Web-приложений: обзор современных решений...WebCamp: Developer Day: Архитектура Web-приложений: обзор современных решений...
WebCamp: Developer Day: Архитектура Web-приложений: обзор современных решений...
 
Andrei shakirin rest_cxf
Andrei shakirin rest_cxfAndrei shakirin rest_cxf
Andrei shakirin rest_cxf
 
20120121 rbc rails_routing
20120121 rbc rails_routing20120121 rbc rails_routing
20120121 rbc rails_routing
 
REST API with CakePHP
REST API with CakePHPREST API with CakePHP
REST API with CakePHP
 
Advanced RESTful Rails
Advanced RESTful RailsAdvanced RESTful Rails
Advanced RESTful Rails
 
Advanced RESTful Rails
Advanced RESTful RailsAdvanced RESTful Rails
Advanced RESTful Rails
 
Restful webservices
Restful webservicesRestful webservices
Restful webservices
 
S313265 - Advanced Java API for RESTful Web Services at JavaOne Brazil 2010
S313265 - Advanced Java API for RESTful Web Services at JavaOne Brazil 2010S313265 - Advanced Java API for RESTful Web Services at JavaOne Brazil 2010
S313265 - Advanced Java API for RESTful Web Services at JavaOne Brazil 2010
 
RailsスタイルからRESTを学ぼう よちがや.rb
RailsスタイルからRESTを学ぼう よちがや.rbRailsスタイルからRESTを学ぼう よちがや.rb
RailsスタイルからRESTを学ぼう よちがや.rb
 
REST APIs in Laravel 101
REST APIs in Laravel 101REST APIs in Laravel 101
REST APIs in Laravel 101
 
Building RESTful applications using Spring MVC
Building RESTful applications using Spring MVCBuilding RESTful applications using Spring MVC
Building RESTful applications using Spring MVC
 
RESTFul WebApp Concept
RESTFul WebApp ConceptRESTFul WebApp Concept
RESTFul WebApp Concept
 
RESTFul WebApp Concept
RESTFul WebApp ConceptRESTFul WebApp Concept
RESTFul WebApp Concept
 
Android and REST
Android and RESTAndroid and REST
Android and REST
 
Rest
RestRest
Rest
 
Rest with Java EE 6 , Security , Backbone.js
Rest with Java EE 6 , Security , Backbone.jsRest with Java EE 6 , Security , Backbone.js
Rest with Java EE 6 , Security , Backbone.js
 
RESTful Web Services with Spring MVC
RESTful Web Services with Spring MVCRESTful Web Services with Spring MVC
RESTful Web Services with Spring MVC
 
Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson
Multi Client Development with Spring for SpringOne 2GX 2013 with Roy ClarksonMulti Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson
Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson
 
Building Web Apps with Express
Building Web Apps with ExpressBuilding Web Apps with Express
Building Web Apps with Express
 

Kürzlich hochgeladen

Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 

Kürzlich hochgeladen (20)

Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 

Rest And Rails

  • 1. REST & Rails Web Services for the Rails World Rein Henrichs http://reinh.com
  • 3. REST & Rails • What Is REST? • Make Rails RESTful • Eating RESTfully • RESTful Tips & Tricks • RESTful Resources
  • 5. Resources • Sources of specific information • Identified by a global identifier (URI) • Hyperlinked to other resources • Examples: • del.icio.us tags, links • Amazon S3 buckets • flickr photos • blog posts • twitters • (Nearly) everything else on the internet
  • 6. Resources • Things • With names • That often relate to other things • On the internet
  • 7. Representations • Formats • HTML, XML, JSON, JPG, SVG, etc. • Content Types (MIME Types) • text/html, application/xml, etc.
  • 8. State • Resource state, not application state • Often database backed (CRUD)
  • 9. Transfer • Use HTTP Verbs • (Constraints are liberating) • Design a Uniform Interface • Simple, Visible, Reusable • Stateless • Manipulate resources by transferring representations
  • 10. Transfer RESTless RESTful VERB HREF VERB URI POST /users/create POST /users GET /users/1 GET /users/1 POST /users/1/update PUT /users/1 ???? /users/1/delete DELETE /users/1
  • 11. Make Rails RESTful • Design your Resources • Create their Representations • Expose them • Profit!
  • 12. Design Your Resources • Identify your resources • Design a URI scheme Entity URI User /users/quentin Photo /photos/grand-canyon Comment /photos/grand-canyon/comments/1 • In rails: map.resources
  • 13. map.resources maps URIs to controllers maps HTTP verbs to actions map.resources :users Resource Verb Action /users GET index /users POST create /users/1 GET show /users/1 PUT update /users/1 DELETE destroy
  • 14. Design Your Resources Caveat Implementor HTML and XHTML currently only support two HTTP verbs: GET and POST. In order to get around this limitation, Rails uses overloaded POST requests with a _method parameter to simulate PUT and DELETE requests. Rails handles this transparently through its view helpers and resource routing.
  • 15. Create Representations Which formats will you provide? • User • Photo • Comment • HTML • HTML • XML • XML • XML • JSON • JSON • JPG • vCard? • Sizes?
  • 16. Expose Resources • Determine the requested resource • Determine the requested representation • Manipulate the resource’s state based on the request method and parameters • Deliver an acceptable representation of the resource’s (new) state
  • 17. Expose Resources Determine the requested resource • Resources are identified by URIs • “Uniform Resource Indicator” • Rails maps URIs to controllers and actions • map.resources :users
  • 18. Expose Resources Determine the requested representation • “Accept” header • params[:format] • users/1.xml
  • 19. Expose Resources Manipulate the resource’s state (Rails 101) • Create the resource @user = User.new(params[:user]) @user.save • Retrieve the resource @user = User.find(params[:id]) • Update the resource @user.update_attributes(params[:user]) • Delete the resource @user.destroy
  • 20. Expose Resources Deliver a representation • Based on Accept header def index @users = User.find(:all) respond_to do |format| format.html # text/html, application/xhtml+xml format.xml # application/xml format.js # text/javascript end end
  • 21. Expose Resources Deliver a representation • Based on format def index @users = User.find(:all) respond_to do |format| format.html # index format.xml # index.xml format.js # index.js end end
  • 22. Expose Resources Deliver a representation • Using templates def index @users = User.find(:all) respond_to do |format| format.html # index.html.erb format.xml # index.xml.builder or index.xml.erb format.js # index.js.rjs or index.js.erb end end
  • 23. Expose Resources Deliver a representation • Using coercion def index @users = User.find(:all) respond_to do |format| format.html # N/A format.xml { render :xml => @users.to_xml } format.js { render :text => @users.to_json } end end
  • 24. Expose Resources Deliver a representation • Using Rails scaffold generator* • ruby script/generate scaffold User • Creates CRUD and index actions that map resources to an ActiveRecord model and respond to html and xml * edge rails / Rails 2.0 (scaffold_resource in 1.2.x)
  • 25. Eating RESTfully • ActiveResource • Alternatives
  • 26. Eating RESTfully ActiveResource • Designed to consume RESTful web services via XML • Treats resources as models • Fairly strict about resource architecture • Some examples please?
  • 27. Eating RESTfully ActiveResource • Consuming our users class User < ActiveResource::Base self.site = quot;http://www.example.comquot; end >> User.find(:all) # users.xml >> User.find(1) # users/1.xml • Consuming our photos class Photo < ActiveResource::Base self.site = quot;http://www.example.comquot; end
  • 28. Eating RESTfully Alternatives • rest-open-uri • JQuery.getJSON()
  • 29. Eating RESTfully gem install rest-open-uri • Wraps Bare metal Net::HTTP library • Extends open-uri to allow PUT, POST, and DELETE • Some examples please? • http://pastie.caboo.se/117513
  • 30. Eating RESTfully JQuery.getJSON() • Asynchronous HTTP request for text/ javascript • JSON object can be passed to anonymous function • Some examples please?
  • 31. Eating RESTfully JQuery.getJSON() var flickr_cats_uri = quot;http://api.flickr.com/services/feeds/photos_public.gne? tags=cat&tagmode=any&format=json&jsoncallback=?quot; $.getJSON(flickr_cats_uri, function(data){ $.each(data.items, function(i,item){ $(quot;<img/>quot;).attr(quot;srcquot;, item.media.m).appendTo(quot;#imagesquot;); if ( i == 3 ) return false; }); });
  • 32. RESTful Tips & Tricks • DRY ActiveResource • DRY RESTful Controllers • Turn verbs into nouns • Custom MIME types
  • 33. RESTful Tips DRY ActiveResource • Consuming our users class User < ActiveResource::Base self.site = quot;http://www.example.comquot; end • Consuming our photos class Photo < ActiveResource::Base self.site = quot;http://www.example.comquot; end
  • 34. RESTful Tips DRY ActiveResource • Create a base class class ExampleSite < ActiveResource::Base self.site = quot;http://www.example.comquot; end • Consuming our users and photos class User < ExampleSite; end class Photo < ExampleSite; end
  • 35. RESTful Tips DRY RESTful Controllers • resource_controller plugin class PostsController < ResourceController::Base end http://jamesgolick.com/resource_controller/rdoc/index.html
  • 36. RESTful Tips Turn Verbs into Nouns Replace RPC* style overloaded POST interfaces with resources that respond to a Uniform Interface by using standard HTTP verbs Method Overloaded POST User.find(1).activated? GET users/1?q=activated User.find(1).activate! POST users/1?m=activate User.find(1).deactivate! POST users/1?m=deactivate * Remote Procedure Call
  • 37. RESTful Tips Turn Verbs into Nouns Replace RPC* style overloaded POST interfaces with resources that respond to a Uniform Interface by using standard HTTP verbs Method Uniform Interface User.find(1).activated? GET users/1/activation User.find(1).activate! POST users/1/activation User.find(1).deactivate! DELETE users/1/activation * Remote Procedure Call
  • 38. RESTful Tips Custom MIME Types Mime::Type.register quot;image/pngquot;, :png Mime::Type.register quot;text/x-vcardquot;, :vcard
  • 40. RESTful Web Services http://www.oreilly.com/ catalog/9780596529260/
  • 41. Peepcode: REST Basics http://nubyonrails.com/ articles/peepcode-rest-basics
  • 42. Fielding Dissertation: Chapter 5 http://www.ics.uci.edu/ ~fielding/pubs/dissertation/ rest_arch_style.htm
  • 44. “My God, it’s full of resources!”