丸山先生レクチャーシリーズ2007-2008
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

丸山先生レクチャーシリーズ2007-2008

on

  • 6,700 views

 

Statistics

Views

Total Views
6,700
Views on SlideShare
6,198
Embed Views
502

Actions

Likes
0
Downloads
42
Comments
0

7 Embeds 502

http://www.eisbahn.jp 493
http://www.slideshare.net 3
http://webcache.googleusercontent.com 2
http://209.85.171.104 1
http://72.14.235.104 1
http://209.85.175.104 1
http://74.125.153.132 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

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

丸山先生レクチャーシリーズ2007-2008 Presentation Transcript

  • 1. Ruby on Rails2.0 における REST 対応 丸山先生レクチャーシリーズ ~ RESTful サービス技術の台頭~ よういちろう 2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09
  • 2. 自己紹介
    • 田中 洋一郎
      • 株式会社エーティーエルシステムズ所属
      • S2Wicket コミッタ
      • こみゅすけ (commusuke.eisbahn.jp) 管理人
        • REST API 現在実装中!
      • Blog 「天使やカイザーと呼ばれて」
        • http://www.eisbahn.jp/yoichiro/
      • Java プログラマ( JRuby on Rails に浮気中)
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09
  • 3. アジェンダ
    • Ruby on Rails における REST
    • RESTful サービスへのアクセス
    • RESTful サービスの実装
    • 認証処理
    • まとめ
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09
  • 4. アジェンダ
    • Ruby on Rails における REST
    • RESTful サービスへのアクセス
    • RESTful サービスの実装
    • 認証処理
    • まとめ
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09
  • 5. Ruby on Rails における REST
    • Rails は MVC モデル
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. dispatcher.cgi routes.rb Controller View Model Database 呼び出す Controller を特定 O/R マッピング Model への操作と View の決定 HTML や XML のレンダリング ActionPack ActiveRecord
  • 6. Ruby on Rails における REST
    • Ruby on Rails 2.0 正式リリース
      • すでに 2.0.1 がある( 2007/12/9 時点)
      • gem install rails => 2.0.1
      • API Reference の記述量がかなり増えている
        • http://api.rubyonrails.org/
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09
  • 7. Ruby on Rails における REST
    • Rails1.2
      • ActionWebService
        • SOAP 対応がメイン
      • RESTful サービスを実装することはできた
        • ActionController::Resources
        • routes.rb での map.resource(s) によるマッピング
        • script/generate scaffold_resource
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09
  • 8. Ruby on Rails における REST
    • Rails2.0
      • RESTful サービスの実装
        • script/generate scaffold が REST 標準対応
        • AtomPub 対応
      • ActiveResource の標準搭載
        • REST クライアントを簡単に作成可能
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 Rails 2.0 では REST がメインとなる
  • 9. Ruby on Rails における REST 2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09
  • 10. アジェンダ
    • Ruby on Rails における REST
    • RESTful サービスへのアクセス
    • RESTful サービスの実装
    • 認証処理
    • まとめ
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09
  • 11. RESTful サービスへのアクセス
    • ActiveResource
      • Business Object と RESTful サービスの接続
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 Business Object ActiveResource RESTful WebService 普通の Object へのアクセス 透過的なプロキシとして機能する Object と REST リソースのマッピング
  • 12. RESTful サービスへのアクセス
    • ActiveResource
      • RESTful サービスなのか Database なのか
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 Business Object Active Resource RESTful WebService Object と REST リソースのマッピング Business Object Active Record Object と Database Entity のマッピング Database
  • 13. RESTful サービスへのアクセス
    • ActiveResource
      • ActiveRecord と使い方は(ほぼ)一緒
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 emp = Employee.new emp.name = ‘yoichiro’ emp. save emp = Employee. find (13308) p emp.name # => “yoichiro” emp = Employee. find (13308) emp. destroy Employee. delete (12345) emp = Employee. find (13308) emp.name = ‘yojiro’ emp. save 生成 検索 更新 削除
  • 14. RESTful サービスへのアクセス
    • ActiveResource
      • 例: Twitter の情報を取得
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 class Status < ActiveResource::Base self. site = ‘http:// [ ユーザ ID]:[ パスワード ]@ twitter.com’ self. logger = Logger.new($stderr) end ActionResource::Base クラスを継承 site クラス変数にリソースの在り処を指定 リソース名をクラス名にする logger クラス変数に設定すると URL が見える HTTP BASIC 認証
  • 15. RESTful サービスへのアクセス
    • ActiveResource
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 >> s = Status.find(‘show/485685072’) => #<Status:0xb58ad1 @prefix_options={}, @attributes={&quot;text&quot;=>&quot;ActiveResource343201247343201223343201256343202271343203206343203274343343203206343202271343203210 ! &quot;, &quot;id&quot;=>&quot;485685072&quot;, &quot;source&quot;=>&quot;web&quot;, &quot;created_at&quot;=>&quot;Mon Dec 10 06:42:46 +0000 2007&quot;}> >> GET http://twitter.com:80/statuses/show/485685072.xml --> 200 OK (733b 0.34s) >> puts s.text ActiveResource でこのステータス取得をテスト! => nil
  • 16. RESTful サービスへのアクセス 2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. Person.find(:all) # => GET /people.xml Person.find(:all, :params => { :title => &quot;CEO&quot; }) # => GET /people.xml?title=CEO Person.find(:first, :from => :managers) # => GET /people/managers.xml Person.find(:all, :from => &quot;/companies/1/people.xml&quot;) # => GET /companies/1/people.xml Person.find(:one, :from => :leader) # => GET /people/leader.xml Person.find(:one, :from => &quot;/companies/1/manager.xml&quot;) # => GET /companies/1/manager.xml StreetAddress.find(1, :params => { :person_id => 1 }) # => GET /people/1/street_addresses/1.xml
  • 17. RESTful サービスへのアクセス
    • ActiveResource
      • 狭義の REST 対応 Web サービス
        • 完璧にリソースをオブジェクトに関連可能
      • REST 準拠 Web サービス
        • 参照系はほとんど対応可能
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 マッシュアップが非常に簡単になる
  • 18. RESTful サービスへのアクセス
    • Ajax で RESTful サービスにアクセス
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. link_to_remote &quot;Delete this post&quot;, :update => &quot;posts&quot;, :url => post_url(@post), :method => :delete , :html => { :class => &quot;destructive&quot; } ヘルパーメソッドが method 指定をサポート <a class=&quot;destructive&quot; href=&quot;#&quot; onclick=&quot;new Ajax.Updater('posts', 'http://localhost:3000/employees/3', {asynchronous:true, evalScripts:true, method:'delete' , parameters:'authenticity_token=' + encodeURIComponent('520fb86f42576048061a5c408604c52411df8841')}); return false;&quot;>Delete this employee</a>
  • 19. RESTful サービスへのアクセス
    • Ajax で RESTful サービスにアクセス
      • ブラウザは GET と POST のみ発行できる
        • PUT 、 DELETE は POST で代用
        • _metod パラメータを使用
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved.
  • 20. アジェンダ
    • Ruby on Rails における REST
    • RESTful サービスへのアクセス
    • RESTful サービスの実装
    • 認証処理
    • まとめ
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09
  • 21. RESTful サービスの実装
    • scaffold によるお手本コード
      • Rails2.0 から REST 対応が標準になった
        • scaffold_resources が格上げ
        • RESTful サービスをコーディングレスで入手
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 Scaffold Code EmployeesController Employee Model Views
  • 22. RESTful サービスの実装
    • scaffold によるお手本コード
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 $ jruby ./script/generate scaffold employee # GET /employees/1 # GET /employees/1.xml def show @employee = Employee.find(params[:id]) respond_to do |format| format.html # show.html.erb format.xml {render :xml => @employee} end end employees_controller.rb ActionController::Routing::Routes.draw do |map| map.resources :employees routes.rb
  • 23. RESTful サービスの実装
    • scaffold によるお手本コード
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 RESTTest scaffold を生成するだけ コーディングなし
  • 24. RESTful サービスの実装
    • Rails での標準的な REST 対応
      • HTTP Method,Path と Controller との関連付け
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 routes.rb map.resources Controller ActiveRecord Database 規則に従って、 HTTP Method および PATH から呼び出す Controller を選定 各メソッド内で ActiveRecord によりリソースを取得・更新 処理結果を HTTP Status に、リソースを XML 形式に変換して返却
  • 25. RESTful サービスの実装
    • routes.rb でのルーティング設定
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 ActionController::Routing::Routes.draw do |map| map.resources :employees end EmployeesController のメソッド Verb Path Method Parameter GET /employees index GET /employees/1 show :id => 1 POST /employees create PUT /employees/1 update :id => 1 DELETE /employees/1 destroy :id => 1
  • 26. RESTful サービスの実装
    • routes.rb でのルーティング設定
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 map.resources :divs do |divs| divs.resources :employees end EmployeesController のメソッド リソースのネスト定義 より多段にすることも可能 Verb Path Method Parameter GET /divs/1/employees index :div_id => 1 GET /divs/1/employees/2 show :div_id => 1 :id => 2 POST /divs/1/employees create :div_id => 1 PUT /divs/1/employees/2 update :div_id => 1 :id => 2 DELETE /divs/1/employees/2 destroy :div_id => 1 :id => 2
  • 27. RESTful サービスの実装
    • GET /employees.xml
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 def index @employees = Employee.find(:all) respond_to do |format| format.html # index.html.erb format.xml { render :xml => @employees } end end routes.rb によるマッピング 「 .xml 」なので、モデルの内容が XML 形式でレンダリングされる
  • 28. RESTful サービスの実装
    • GET /employees.xml
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 format.xml { render :xml => @employees } <?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?> <employees type=&quot;array&quot;> <employee> <id type=&quot;integer&quot;>3</id> <name>Yoichiro Tanaka</name> </employee> ・・・ </employees> View を作らなくてもレンダリングされる
  • 29. RESTful サービスの実装
    • GET /employees/1.xml
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 def show begin @employee = Employee.find(params[:id]) respond_to do |format| format.html # show.html.erb format.xml { render :xml => @employee } end rescue ActiveRecord::RecordNotFound head :not_found end end routes.rb によるマッピング 「 .xml 」なので、モデルの内容が XML 形式でレンダリングされる リソースがない場合は 404 を返す
  • 30. RESTful サービスの実装
    • POST /employees.xml
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 def create @employee = Employee.new(params[:employee]) respond_to do |format| if @employee.save format.html { redirect_to(@employee) } format.xml { render :xml => @employee, :status => :created, :location => @employee } else ・・・ end routes.rb によるマッピング 新規作成処理の結果、 ステータスコードは 201 Location ヘッダはリソースの URI を返却する
  • 31. RESTful サービスの実装
    • PUT /employees/1.xml
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 def update begin @employee = Employee.find(params[:id]) respond_to do |format| if @employee.update_attribute(params[:employee]) format.html { redirect_to(@employee) } format.xml { head :ok } else ・・・ rescue ActiveRecord::RecordNotFond head :not_found end end routes.rb によるマッピング 更新処理の結果、 ステータスコードは 200 を返却する リソースがない場合は 404 を返す
  • 32. RESTful サービスの実装
    • DELETE /employees/1.xml
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 def destroy begin @employee = Employee.find(params[:id]) @employee.destroy respond_to do |format| format.html { redirect_to(employees_url) } format.xml { head :ok } end rescue ActiveRecord::RecordNotFond head :not_found end end routes.rb によるマッピング 削除処理の結果、 ステータスコードは 200 を返却する リソースがない場合は 404 を返す
  • 33. RESTful サービスの実装
    • AtomPub
      • Rails2.0 から実装しやすくなった
        • Accept や URI の拡張子による View の切り替え
        • Builder テンプレートによる XML 構築
        • atom_feed ヘルパーメソッドの提供
      • リソースの扱い
        • コレクションリソースは feed
        • メンバリソースは entry
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved.
  • 34. RESTful サービスの実装
    • Rails での Atom 的な REST 対応
      • HTTP Method,Path と Controller との関連付け
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 routes.rb map.resources Controller ActiveRecord Database 規則に従って、 HTTP Method および PATH から呼び出す Controller を選定 各メソッド内で ActiveRecord によりリソースを取得・更新 atom.builder filter View で Atom Feed を構築して返却 リクエストの XML を params ハッシュに変換
  • 35. RESTful サービスの実装
    • index.atom.builder
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. atom_feed do |feed| feed.title(&quot;My great blog!&quot;) feed.updated((@posts.first.created_at)) for post in @posts feed.entry(post) do |entry| entry.title(post.title) entry.content(post.body, :type => 'html') entry.author do |author| author.name(&quot;DHH&quot;) end end end end View ヘルパーを使う
  • 36. RESTful サービスの実装
    • 新規投稿リクエストの受付
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. def parse_request_xml if /^application/atom+xml/.match( request.env[“CONTENT_TYPE”] ) xml = REXML::Document.new(request.raw_post) params[:post] = { :title => xml.elements[“ entry/title ”].text :content => xml.elements[“ entry/content ”].text } end return true end 変換ロジックは自作する このメソッドを before フィルタとしておくと良い XML をパースして、各要素から params ハッシュに格納 request.format = Mime::ATOM でも可
  • 37. RESTful サービスの実装
    • 新規投稿リクエストの受付
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. def create @post = Post.new( params[:post] ) @post.save respond_to do |format| format.atom do headers[“Content-Type”] = “ application/atom+xml;type=entry” render :action => “show”, :status => :created, :location => post_url(@post) + “.atom” end end end parse_request_xml により params[:post] が利用可能 POST /posts.atom により format.atom が対応 新規投稿処理の結果、 ステータスコードは 201 Location ヘッダはリソースの URI を返却する
  • 38. RESTful サービスの実装
    • show.atom.builder
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. xml .instruct! xml.entry(“xml:lang” => “ja”, “ xmlns” => “http://www.w3.org/2005/Atom”) do |entry| entry.title(@post.title) entry.content(@post.body, :type => 'html') entry.author do |author| author.name(&quot;DHH&quot;) end end Builder::XmlMarkup を使って構築
  • 39. アジェンダ
    • Ruby on Rails における REST
    • RESTful サービスへのアクセス
    • RESTful サービスの実装
    • 認証処理
    • まとめ
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09
  • 40. 認証処理
    • REST Web サービスで使われる認証
      • HTTP BASIC 認証
      • WSSE 認証
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved.
  • 41. 認証処理
    • HTTP BASIC 認証 (Rails 2.0 から標準搭載 )
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. class ApplicationController < ActionController::Base before_filter :authenticate protected def authenticate if request.format == Mime::ATOM if user = authenticate_with_http_basic { |u, p| @account.authenticate(u, p) } @current_user = user else request_http_basic_authentication end else request からユーザ ID およびパスワードを取得して認証を実施 認証失敗時に再度ブラウザに認証情報送信を要求 AtomPub の場合
  • 42. 認証処理
    • WSSE 認証
      • Atom API で多く使われる認証方式
      • X-WSSE ヘッダを用いて認証用文字列を送信
        • 認証用文字列はユーザ名とパスワードを含む
        • パスワードは SHA1 によるダイジェスト
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 X-WSSE: UsernameToken Username=“yoichiro&quot;, PasswordDigest=&quot;ZCNaK2jrXr4+zsCaYK/YLUxImZU=&quot;, Nonce=&quot;Uh95NQlviNpJQR1MmML+zq6pFxE=&quot;, Created=&quot;2007-12-11T22:51:15Z&quot;
  • 43. 認証処理 2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. require ‘base64’ def auth_wsse @@wsse_pattern ||= /^UsernameToken Username=&quot;([^&quot;]+)&quot;,sPasswordDigest= &quot;([^&quot;]+)&quot;,sNonce=&quot;([^&quot;]+)&quot;,sCreated=&quot;([^&quot;]+)&quot;$/ if request.env['HTTP_X_WSSE'] && @@wsse_pattern =~ request.env['HTTP_X_WSSE'] username = $1 passwd = Base64.decode64($2) nonce = Base64.decode64($3) created = $4 return username == ‘yoichiro‘ && Digest::SHA1.digest( nonce + created + ‘pass’) == passwd else ・・・ end 正規表現により認証情報を取得 パスワードと付加情報から SHA1 ダイジェストを生成し比較 これも before フィルタとしておけば便利
  • 44. 認証処理
    • 気になる点
      • 付加情報 (nonce,created) より SHA1 を実施
        • サーバにパスワード「そのもの」が必要になる
        • BASIC 認証よりはマシ?
        • SHA1 の前にハッシュをしておく?
        • HTTPS + BASIC 認証が良い?
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved.
  • 45. まとめ
    • Ruby on Rails 2.0
      • ActionWebService をあっさりと捨てた大胆さ
      • RESTful サービスにあっさりとアクセス可能
      • RESTful 実装コードをあっさりと入手可能
      • 認証処理もあっさりと実装可能
    2007/12/18 (c) 2007 Yoichiro Tanaka. All rights Reserved. 05/29/09 Rails 2.0 は RESTful に最適な環境