SlideShare a Scribd company logo
1 of 45
Rails: Web API
       shaokun.wu@gmail.com


 Thanks to Leon Du and Rain Chen
You should start with...

• ruby 1.9.2
  Performance, Threads/Fibers, Encoding/Unicode...




• rails 3.1.0
  Asset pipeline, HTTP streaming, jQuery
Rails on Campus
https://github.com/kudelabs/roc-demo1
https://github.com/kudelabs/roc-demo2
GZRuby
http://groups.google.com/group/gzruby?lnk=srg
talk about...
• API
• API
•        API

•
•
Start Simple but Elegant
     http://localhost:3000/api/messages
   http://localhost:3000/api/messages/{id}
•   $ git clone git://github.com/kudelabs/roc-demo2.git

•   $ cd roc-demo2

•   $ bundle install

•   $ rake db:create

•   $ rake db:migrate

•   $ rails server

•   goto http://localhost:3000
•   $ rails generate controller api::messages
    apps/controllers/api/messages_controller.rb
    test/functional/api/messages_controller_test.rb
apps/controllers/api/messages_controller.rb
    class Api::MessagesController < ApplicationController
      # GET /api/messages.json
      def index
        @messages = Message.all

        respond_to do |format|
          format.json { render json: @messages }
        end
      end

      # GET /api/messages/1.json
      def show
        @message = Message.find(params[:id])

        respond_to do |format|
          format.json { render json: @message }
        end
      end
    end
curl http://localhost:3000/api/messages
Start Alone but
Test is Your Partner
     rake test:functionals
        rake test:units
     rake test:integration
test/functional/api/messages_controller_test.rb
   class Api::MessagesControllerTest < ActionController::TestCase
     setup do
       @message = messages(:one)
     end

    test "should get index" do
      get :index, format: :json
      assert_response :success
      assert_not_nil assigns(:messages)
    end

     test "should show message" do
       get :show, format: :json, id: @message.to_param
       assert_response :success
     end
   end
API
built-in Namespaced
     controllers
  http://localhost:3000/api/v2/messages

       Rocweibo::Application.routes.draw do
         namespace :api do
           resources :messages

           namespace :v2 do
             resources :messages
           end
         end
       end
test/functional/api/v2/messages_controller_test.rb
class Api::V2::MessagesController < Api::ApplicationController
  before_filter :authenticate, :only => :create

 ...

 # curl -X POST -H "Accept: application/json" --user shaokun.wu@gmail.com:a
 # http://localhost:3000/api/v2/messages -d "message[body]=abcdefg"
 def create
   @message = Message.new(params[:message])
   @message.user = @current_user
   @message.save!

    render json: @message
  end

  private
  def authenticate
    if user = authenticate_with_http_basic { |u, p| User.authenticate(u, p) }
      @current_user = user
    else
      request_http_basic_authentication
    end
  end
end
Keep Refactoring
whenever You could
  Don’t Repeat Yourself & Decoupling
class Api::V2::MessagesController < Api::ApplicationController
  ...

  private
  def authenticate
    if user = authenticate_with_http_basic { |u, p| User.authenticate(u, p) }
      @current_user = user
    else
      request_http_basic_authentication
    end
  end
end




class Api::ApplicationController < ActionController::Base
  private
  def authenticate
    if user = authenticate_with_http_basic { |u, p| User.authenticate(u, p) }
      @current_user = user
    else
      request_http_basic_authentication
    end
  end
end
/app/controllers/api/application_controller.rb
    class Api::ApplicationController < ActionController::Base
    end




 /app/controllers/application_controller.rb
      class ApplicationController < ActionController::Base
        helper_method :current_user, :logged_in?
        protect_from_forgery

        before_filter :require_logged_in
        ...
      end
Grape
A opinionated micro-framework for
  creating REST-like APIs in Ruby.
class Rocweibo::V1::API < Grape::API
  prefix 'api'
  version 'v1'

 resource :messages do
   get do
     Message.limit(20)
   end

    get ':id' do
      Message.find(params[:id])
    end
  end
end




                                  Rocweibo::Application.routes.draw do
                                    mount Rocweibo::V1::API => "/" # mount API routes
                                    ...
                                  end
Where to HOST your app?
No Easy Way to Host in China :(

•   Amazon EC2

•   Linode

•   DotCloud

•   Heroku
DotCloud
$ dotcloud push {myapp} {myrepopath}/
• $ dotcloud create rocdemo
• $ touch dotcloud.yml
• $ dotcloud push rocdemo .
• or
    $ dotcloud push -b mybranch rocdemo .
Deployment finished. Your application is available at the following URLs
www: http://rocdemo-limiru2n.dotcloud.com/
add mysql service
# just update the content of your dotcloud.yml
www:
  type: ruby                                      $ dotcloud info rocdemo
data:
  type: mysql                                     data:
                                                       config:
                                                           mysql_password: ...
                                                       instances: 1
                                                       type: mysql
# also, update the content of your database.yml
                                                  www:
production:
                                                       config:
  adapter: mysql2
                                                           rack-env: production
  encoding: utf8
                                                           ruby-version: 1.9.2
  reconnect: false
                                                       instances: 1
  database: roc_demo2_production
                                                       type: ruby
  pool: 5
                                                       url: http://rocdemo-limiru2n.dotclo
  username: root
  password: ...
  port: 14895
  host: rocdemo-LIMIRU2N.dotcloud.com
• dotcloud logs rocdemo.www
• dotcloud ssh rocdemo.www
• dotcloud info rocdemo
Rails Admin
•   Display database tables

•   Create new data

•   Easily update data

•   Safely delete data

•   Automatic form validation

•   Search and filtering

•   Export data to CSV/JSON/XML

•   Authentication (via Devise)

•   User action history
• add the line below to your Gemfile
  gem 'rails_admin', :git => 'git://github.com/sferik/rails_admin.git'



• $ bundle install
• $ rails g rails_admin:install
Cache & Daemon
def index
  @messages = Rails.cache.fetch('all_messages', :expires_in => 30.seconds) do
    Message.all
  end

  respond_to do |format|
    format.json { render json: @messages }
  end
end
Started GET "/api/v2/messages.json" for 127.0.0.1 at 2011-09-15 17:29:53 +0800
  Processing by Api::V2::MessagesController#index as JSON
  Message Load (0.1ms)          SELECT "messages".* FROM "messages"
Completed 200 OK in 46ms (Views: 11.4ms | ActiveRecord: 0.4ms)



Started GET "/api/v2/messages.json" for 127.0.0.1 at 2011-09-15 17:29:58 +0800
  Processing by Api::V2::MessagesController#index as JSON
Completed 200 OK in 7ms (Views: 6.1ms | ActiveRecord: 0.2ms)
•    Production



•        Cache


• Production      memcache
Rocweibo::Application.configure do
  # Settings specified here will take precedence over those in config/application.rb

  # Code is not reloaded between requests
  config.cache_classes = true

  ...
  # Use a different cache store in production
  # config.cache_store = :mem_cache_store
  ...
  # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
  # the I18n.default_locale when a translation can not be found)
  config.i18n.fallbacks = true

  # Send deprecation notices to registered listeners
  config.active_support.deprecation = :notify
end
Daemon
how to run your Background Job
     rails runner lib/my_script.rb
puts %(There are #{Message.count} messages
and #{User.count} users in our database.)

count = Reply.delete_all(["body LIKE ?", "%fuck%"])
puts "#{count} replies contains "fuck" got deleted."

count = User.delete_all(
  [
    "created_at < ? AND email_confirmed = ?",
    Time.new - 2.days,
    false
  ]
)

puts "#{count} not confirmed users within 2 days got deleted."
Delayed Job
http://railscasts.com/episodes/171-delayed-job
still interesting...

•   http://martinciu.com/2011/01/mounting-grape-api-inside-rails-
    application.html

•   http://docs.dotcloud.com/services/ruby/

•   http://railscasts.com/episodes/171-delayed-job

•   http://www.sinatrarb.com/
@shaokunwu
http://weibo.com/shaokunwu

More Related Content

What's hot

Building web framework with Rack
Building web framework with RackBuilding web framework with Rack
Building web framework with Racksickill
 
Phpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friendsPhpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friendsMichael Peacock
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overviewYehuda Katz
 
Creating REST Applications with the Slim Micro-Framework by Vikram Vaswani
Creating REST Applications with the Slim Micro-Framework by Vikram VaswaniCreating REST Applications with the Slim Micro-Framework by Vikram Vaswani
Creating REST Applications with the Slim Micro-Framework by Vikram Vaswanivvaswani
 
Web service with Laravel
Web service with LaravelWeb service with Laravel
Web service with LaravelAbuzer Firdousi
 
Rails2 Pr
Rails2 PrRails2 Pr
Rails2 Prxibbar
 
Introduction to Rails - presented by Arman Ortega
Introduction to Rails - presented by Arman OrtegaIntroduction to Rails - presented by Arman Ortega
Introduction to Rails - presented by Arman Ortegaarman o
 
From Ruby to Node.js
From Ruby to Node.jsFrom Ruby to Node.js
From Ruby to Node.jsjubilem
 
An introduction to Laravel Passport
An introduction to Laravel PassportAn introduction to Laravel Passport
An introduction to Laravel PassportMichael Peacock
 
Wykorzystanie form request przy implementacji API w Laravelu
Wykorzystanie form request przy implementacji API w LaraveluWykorzystanie form request przy implementacji API w Laravelu
Wykorzystanie form request przy implementacji API w LaraveluLaravel Poland MeetUp
 
RESTful API development in Laravel 4 - Christopher Pecoraro
RESTful API development in Laravel 4 - Christopher PecoraroRESTful API development in Laravel 4 - Christopher Pecoraro
RESTful API development in Laravel 4 - Christopher PecoraroChristopher Pecoraro
 
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
 
Slim RedBeanPHP and Knockout
Slim RedBeanPHP and KnockoutSlim RedBeanPHP and Knockout
Slim RedBeanPHP and KnockoutVic Metcalfe
 
Perl web frameworks
Perl web frameworksPerl web frameworks
Perl web frameworksdiego_k
 
Introduction to Node.JS Express
Introduction to Node.JS ExpressIntroduction to Node.JS Express
Introduction to Node.JS ExpressEueung Mulyana
 

What's hot (20)

Phinx talk
Phinx talkPhinx talk
Phinx talk
 
Building web framework with Rack
Building web framework with RackBuilding web framework with Rack
Building web framework with Rack
 
Phpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friendsPhpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friends
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overview
 
Getting Started-with-Laravel
Getting Started-with-LaravelGetting Started-with-Laravel
Getting Started-with-Laravel
 
Fabric Python Lib
Fabric Python LibFabric Python Lib
Fabric Python Lib
 
Creating REST Applications with the Slim Micro-Framework by Vikram Vaswani
Creating REST Applications with the Slim Micro-Framework by Vikram VaswaniCreating REST Applications with the Slim Micro-Framework by Vikram Vaswani
Creating REST Applications with the Slim Micro-Framework by Vikram Vaswani
 
Web service with Laravel
Web service with LaravelWeb service with Laravel
Web service with Laravel
 
Rails2 Pr
Rails2 PrRails2 Pr
Rails2 Pr
 
Express JS
Express JSExpress JS
Express JS
 
Introduction to Rails - presented by Arman Ortega
Introduction to Rails - presented by Arman OrtegaIntroduction to Rails - presented by Arman Ortega
Introduction to Rails - presented by Arman Ortega
 
From Ruby to Node.js
From Ruby to Node.jsFrom Ruby to Node.js
From Ruby to Node.js
 
An introduction to Laravel Passport
An introduction to Laravel PassportAn introduction to Laravel Passport
An introduction to Laravel Passport
 
Wykorzystanie form request przy implementacji API w Laravelu
Wykorzystanie form request przy implementacji API w LaraveluWykorzystanie form request przy implementacji API w Laravelu
Wykorzystanie form request przy implementacji API w Laravelu
 
RESTful API development in Laravel 4 - Christopher Pecoraro
RESTful API development in Laravel 4 - Christopher PecoraroRESTful API development in Laravel 4 - Christopher Pecoraro
RESTful API development in Laravel 4 - Christopher Pecoraro
 
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
 
Slim RedBeanPHP and Knockout
Slim RedBeanPHP and KnockoutSlim RedBeanPHP and Knockout
Slim RedBeanPHP and Knockout
 
RESTful web services
RESTful web servicesRESTful web services
RESTful web services
 
Perl web frameworks
Perl web frameworksPerl web frameworks
Perl web frameworks
 
Introduction to Node.JS Express
Introduction to Node.JS ExpressIntroduction to Node.JS Express
Introduction to Node.JS Express
 

Viewers also liked

WebSocket 实时推特流
WebSocket 实时推特流WebSocket 实时推特流
WebSocket 实时推特流shaokun
 
VIM for the PHP Developer
VIM for the PHP DeveloperVIM for the PHP Developer
VIM for the PHP DeveloperJohn Congdon
 
Git flow
Git flowGit flow
Git flowshaokun
 
iOS 图片浏览器 DIY
iOS 图片浏览器 DIYiOS 图片浏览器 DIY
iOS 图片浏览器 DIYshaokun
 
Rest Ruby On Rails
Rest Ruby On RailsRest Ruby On Rails
Rest Ruby On Railsshaokun
 
Rails Engine | Modular application
Rails Engine | Modular applicationRails Engine | Modular application
Rails Engine | Modular applicationmirrec
 
Namespace less engine
Namespace less engineNamespace less engine
Namespace less engineshaokun
 

Viewers also liked (8)

Rack
RackRack
Rack
 
WebSocket 实时推特流
WebSocket 实时推特流WebSocket 实时推特流
WebSocket 实时推特流
 
VIM for the PHP Developer
VIM for the PHP DeveloperVIM for the PHP Developer
VIM for the PHP Developer
 
Git flow
Git flowGit flow
Git flow
 
iOS 图片浏览器 DIY
iOS 图片浏览器 DIYiOS 图片浏览器 DIY
iOS 图片浏览器 DIY
 
Rest Ruby On Rails
Rest Ruby On RailsRest Ruby On Rails
Rest Ruby On Rails
 
Rails Engine | Modular application
Rails Engine | Modular applicationRails Engine | Modular application
Rails Engine | Modular application
 
Namespace less engine
Namespace less engineNamespace less engine
Namespace less engine
 

Similar to Rails web api 开发

Infrastructureascode slideshare-160331143725
Infrastructureascode slideshare-160331143725Infrastructureascode slideshare-160331143725
Infrastructureascode slideshare-160331143725miguel dominguez
 
Infrastructureascode slideshare-160331143725
Infrastructureascode slideshare-160331143725Infrastructureascode slideshare-160331143725
Infrastructureascode slideshare-160331143725MortazaJohari
 
Infrastructure as code: running microservices on AWS using Docker, Terraform,...
Infrastructure as code: running microservices on AWS using Docker, Terraform,...Infrastructure as code: running microservices on AWS using Docker, Terraform,...
Infrastructure as code: running microservices on AWS using Docker, Terraform,...Yevgeniy Brikman
 
Porting Rails Apps to High Availability Systems
Porting Rails Apps to High Availability SystemsPorting Rails Apps to High Availability Systems
Porting Rails Apps to High Availability SystemsMarcelo Pinheiro
 
Cloud Foundry Open Tour China
Cloud Foundry Open Tour ChinaCloud Foundry Open Tour China
Cloud Foundry Open Tour Chinamarklucovsky
 
Phoenix for Rails Devs
Phoenix for Rails DevsPhoenix for Rails Devs
Phoenix for Rails DevsDiacode
 
Ruby on Rails and Docker - Why should I care?
Ruby on Rails and Docker - Why should I care?Ruby on Rails and Docker - Why should I care?
Ruby on Rails and Docker - Why should I care?Adam Hodowany
 
Cloud Foundry Open Tour China (english)
Cloud Foundry Open Tour China (english)Cloud Foundry Open Tour China (english)
Cloud Foundry Open Tour China (english)marklucovsky
 
Making a small QA system with Docker
Making a small QA system with DockerMaking a small QA system with Docker
Making a small QA system with DockerNaoki AINOYA
 
Amazon Web Services and Docker: from developing to production
Amazon Web Services and Docker: from developing to productionAmazon Web Services and Docker: from developing to production
Amazon Web Services and Docker: from developing to productionPaolo latella
 
From development environments to production deployments with Docker, Compose,...
From development environments to production deployments with Docker, Compose,...From development environments to production deployments with Docker, Compose,...
From development environments to production deployments with Docker, Compose,...Jérôme Petazzoni
 
Building RESTful APIs w/ Grape
Building RESTful APIs w/ GrapeBuilding RESTful APIs w/ Grape
Building RESTful APIs w/ GrapeDaniel Doubrovkine
 
Deploying your web application with AWS ElasticBeanstalk
Deploying your web application with AWS ElasticBeanstalkDeploying your web application with AWS ElasticBeanstalk
Deploying your web application with AWS ElasticBeanstalkJulien SIMON
 
A Tale of a Server Architecture (Frozen Rails 2012)
A Tale of a Server Architecture (Frozen Rails 2012)A Tale of a Server Architecture (Frozen Rails 2012)
A Tale of a Server Architecture (Frozen Rails 2012)Flowdock
 
Exploring MySQL Operator for Kubernetes in Python
Exploring MySQL Operator for Kubernetes in PythonExploring MySQL Operator for Kubernetes in Python
Exploring MySQL Operator for Kubernetes in PythonIvan Ma
 
Control your deployments with Capistrano
Control your deployments with CapistranoControl your deployments with Capistrano
Control your deployments with CapistranoRamazan K
 

Similar to Rails web api 开发 (20)

Infrastructureascode slideshare-160331143725
Infrastructureascode slideshare-160331143725Infrastructureascode slideshare-160331143725
Infrastructureascode slideshare-160331143725
 
Infrastructureascode slideshare-160331143725
Infrastructureascode slideshare-160331143725Infrastructureascode slideshare-160331143725
Infrastructureascode slideshare-160331143725
 
Infrastructure as code: running microservices on AWS using Docker, Terraform,...
Infrastructure as code: running microservices on AWS using Docker, Terraform,...Infrastructure as code: running microservices on AWS using Docker, Terraform,...
Infrastructure as code: running microservices on AWS using Docker, Terraform,...
 
Supa fast Ruby + Rails
Supa fast Ruby + RailsSupa fast Ruby + Rails
Supa fast Ruby + Rails
 
Porting Rails Apps to High Availability Systems
Porting Rails Apps to High Availability SystemsPorting Rails Apps to High Availability Systems
Porting Rails Apps to High Availability Systems
 
Cloud Foundry Open Tour China
Cloud Foundry Open Tour ChinaCloud Foundry Open Tour China
Cloud Foundry Open Tour China
 
Phoenix for Rails Devs
Phoenix for Rails DevsPhoenix for Rails Devs
Phoenix for Rails Devs
 
Ruby on Rails and Docker - Why should I care?
Ruby on Rails and Docker - Why should I care?Ruby on Rails and Docker - Why should I care?
Ruby on Rails and Docker - Why should I care?
 
Dev streams2
Dev streams2Dev streams2
Dev streams2
 
Cloud Foundry Open Tour China (english)
Cloud Foundry Open Tour China (english)Cloud Foundry Open Tour China (english)
Cloud Foundry Open Tour China (english)
 
Intro to Rack
Intro to RackIntro to Rack
Intro to Rack
 
Making a small QA system with Docker
Making a small QA system with DockerMaking a small QA system with Docker
Making a small QA system with Docker
 
Amazon Web Services and Docker: from developing to production
Amazon Web Services and Docker: from developing to productionAmazon Web Services and Docker: from developing to production
Amazon Web Services and Docker: from developing to production
 
From development environments to production deployments with Docker, Compose,...
From development environments to production deployments with Docker, Compose,...From development environments to production deployments with Docker, Compose,...
From development environments to production deployments with Docker, Compose,...
 
Wider than rails
Wider than railsWider than rails
Wider than rails
 
Building RESTful APIs w/ Grape
Building RESTful APIs w/ GrapeBuilding RESTful APIs w/ Grape
Building RESTful APIs w/ Grape
 
Deploying your web application with AWS ElasticBeanstalk
Deploying your web application with AWS ElasticBeanstalkDeploying your web application with AWS ElasticBeanstalk
Deploying your web application with AWS ElasticBeanstalk
 
A Tale of a Server Architecture (Frozen Rails 2012)
A Tale of a Server Architecture (Frozen Rails 2012)A Tale of a Server Architecture (Frozen Rails 2012)
A Tale of a Server Architecture (Frozen Rails 2012)
 
Exploring MySQL Operator for Kubernetes in Python
Exploring MySQL Operator for Kubernetes in PythonExploring MySQL Operator for Kubernetes in Python
Exploring MySQL Operator for Kubernetes in Python
 
Control your deployments with Capistrano
Control your deployments with CapistranoControl your deployments with Capistrano
Control your deployments with Capistrano
 

Recently uploaded

A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????blackmambaettijean
 

Recently uploaded (20)

A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????
 

Rails web api 开发

  • 1. Rails: Web API shaokun.wu@gmail.com Thanks to Leon Du and Rain Chen
  • 2. You should start with... • ruby 1.9.2 Performance, Threads/Fibers, Encoding/Unicode... • rails 3.1.0 Asset pipeline, HTTP streaming, jQuery
  • 4.
  • 5.
  • 7. talk about... • API • API • API • •
  • 8. Start Simple but Elegant http://localhost:3000/api/messages http://localhost:3000/api/messages/{id}
  • 9. $ git clone git://github.com/kudelabs/roc-demo2.git • $ cd roc-demo2 • $ bundle install • $ rake db:create • $ rake db:migrate • $ rails server • goto http://localhost:3000
  • 10. $ rails generate controller api::messages apps/controllers/api/messages_controller.rb test/functional/api/messages_controller_test.rb
  • 11. apps/controllers/api/messages_controller.rb class Api::MessagesController < ApplicationController # GET /api/messages.json def index @messages = Message.all respond_to do |format| format.json { render json: @messages } end end # GET /api/messages/1.json def show @message = Message.find(params[:id]) respond_to do |format| format.json { render json: @message } end end end
  • 13. Start Alone but Test is Your Partner rake test:functionals rake test:units rake test:integration
  • 14. test/functional/api/messages_controller_test.rb class Api::MessagesControllerTest < ActionController::TestCase setup do @message = messages(:one) end test "should get index" do get :index, format: :json assert_response :success assert_not_nil assigns(:messages) end test "should show message" do get :show, format: :json, id: @message.to_param assert_response :success end end
  • 15. API
  • 16. built-in Namespaced controllers http://localhost:3000/api/v2/messages Rocweibo::Application.routes.draw do namespace :api do resources :messages namespace :v2 do resources :messages end end end
  • 17. test/functional/api/v2/messages_controller_test.rb class Api::V2::MessagesController < Api::ApplicationController before_filter :authenticate, :only => :create ... # curl -X POST -H "Accept: application/json" --user shaokun.wu@gmail.com:a # http://localhost:3000/api/v2/messages -d "message[body]=abcdefg" def create @message = Message.new(params[:message]) @message.user = @current_user @message.save! render json: @message end private def authenticate if user = authenticate_with_http_basic { |u, p| User.authenticate(u, p) } @current_user = user else request_http_basic_authentication end end end
  • 18. Keep Refactoring whenever You could Don’t Repeat Yourself & Decoupling
  • 19. class Api::V2::MessagesController < Api::ApplicationController ... private def authenticate if user = authenticate_with_http_basic { |u, p| User.authenticate(u, p) } @current_user = user else request_http_basic_authentication end end end class Api::ApplicationController < ActionController::Base private def authenticate if user = authenticate_with_http_basic { |u, p| User.authenticate(u, p) } @current_user = user else request_http_basic_authentication end end end
  • 20. /app/controllers/api/application_controller.rb class Api::ApplicationController < ActionController::Base end /app/controllers/application_controller.rb class ApplicationController < ActionController::Base helper_method :current_user, :logged_in? protect_from_forgery before_filter :require_logged_in ... end
  • 21. Grape A opinionated micro-framework for creating REST-like APIs in Ruby.
  • 22. class Rocweibo::V1::API < Grape::API prefix 'api' version 'v1' resource :messages do get do Message.limit(20) end get ':id' do Message.find(params[:id]) end end end Rocweibo::Application.routes.draw do mount Rocweibo::V1::API => "/" # mount API routes ... end
  • 23. Where to HOST your app?
  • 24. No Easy Way to Host in China :( • Amazon EC2 • Linode • DotCloud • Heroku
  • 25. DotCloud $ dotcloud push {myapp} {myrepopath}/
  • 26. • $ dotcloud create rocdemo • $ touch dotcloud.yml • $ dotcloud push rocdemo . • or $ dotcloud push -b mybranch rocdemo . Deployment finished. Your application is available at the following URLs www: http://rocdemo-limiru2n.dotcloud.com/
  • 27. add mysql service # just update the content of your dotcloud.yml www: type: ruby $ dotcloud info rocdemo data: type: mysql data: config: mysql_password: ... instances: 1 type: mysql # also, update the content of your database.yml www: production: config: adapter: mysql2 rack-env: production encoding: utf8 ruby-version: 1.9.2 reconnect: false instances: 1 database: roc_demo2_production type: ruby pool: 5 url: http://rocdemo-limiru2n.dotclo username: root password: ... port: 14895 host: rocdemo-LIMIRU2N.dotcloud.com
  • 28. • dotcloud logs rocdemo.www • dotcloud ssh rocdemo.www • dotcloud info rocdemo
  • 30. Display database tables • Create new data • Easily update data • Safely delete data • Automatic form validation • Search and filtering • Export data to CSV/JSON/XML • Authentication (via Devise) • User action history
  • 31. • add the line below to your Gemfile gem 'rails_admin', :git => 'git://github.com/sferik/rails_admin.git' • $ bundle install • $ rails g rails_admin:install
  • 32.
  • 33.
  • 34.
  • 36. def index @messages = Rails.cache.fetch('all_messages', :expires_in => 30.seconds) do Message.all end respond_to do |format| format.json { render json: @messages } end end
  • 37. Started GET "/api/v2/messages.json" for 127.0.0.1 at 2011-09-15 17:29:53 +0800 Processing by Api::V2::MessagesController#index as JSON Message Load (0.1ms) SELECT "messages".* FROM "messages" Completed 200 OK in 46ms (Views: 11.4ms | ActiveRecord: 0.4ms) Started GET "/api/v2/messages.json" for 127.0.0.1 at 2011-09-15 17:29:58 +0800 Processing by Api::V2::MessagesController#index as JSON Completed 200 OK in 7ms (Views: 6.1ms | ActiveRecord: 0.2ms)
  • 38. Production • Cache • Production memcache
  • 39. Rocweibo::Application.configure do # Settings specified here will take precedence over those in config/application.rb # Code is not reloaded between requests config.cache_classes = true ... # Use a different cache store in production # config.cache_store = :mem_cache_store ... # Enable locale fallbacks for I18n (makes lookups for any locale fall back to # the I18n.default_locale when a translation can not be found) config.i18n.fallbacks = true # Send deprecation notices to registered listeners config.active_support.deprecation = :notify end
  • 40. Daemon how to run your Background Job rails runner lib/my_script.rb
  • 41. puts %(There are #{Message.count} messages and #{User.count} users in our database.) count = Reply.delete_all(["body LIKE ?", "%fuck%"]) puts "#{count} replies contains "fuck" got deleted." count = User.delete_all( [ "created_at < ? AND email_confirmed = ?", Time.new - 2.days, false ] ) puts "#{count} not confirmed users within 2 days got deleted."
  • 43.
  • 44. still interesting... • http://martinciu.com/2011/01/mounting-grape-api-inside-rails- application.html • http://docs.dotcloud.com/services/ruby/ • http://railscasts.com/episodes/171-delayed-job • http://www.sinatrarb.com/

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n