• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Rails web api 开发
 

Rails web api 开发

on

  • 1,812 views

Get your started for developing Web API through Rails.

Get your started for developing Web API through Rails.

Statistics

Views

Total Views
1,812
Views on SlideShare
1,810
Embed Views
2

Actions

Likes
4
Downloads
29
Comments
0

1 Embed 2

http://www.hanrss.com 2

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

Rails web api 开发 Rails web api 开发 Presentation Transcript

  • 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 Campushttps://github.com/kudelabs/roc-demo1https://github.com/kudelabs/roc-demo2
  • GZRubyhttp://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 butTest 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.rbclass 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 endend
  • Keep Refactoringwhenever 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 endendclass 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 endend
  • /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
  • GrapeA 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 endend 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 URLswww: http://rocdemo-limiru2n.dotcloud.com/
  • add mysql service# just update the content of your dotcloud.ymlwww: type: ruby $ dotcloud info rocdemodata: 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 } endend
  • 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 JSONCompleted 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 = :notifyend
  • Daemonhow to run your Background Job rails runner lib/my_script.rb
  • puts %(There are #{Message.count} messagesand #{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 Jobhttp://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/
  • @shaokunwuhttp://weibo.com/shaokunwu