Ruby on Rails= RESTful WebサービスAPIを使用するアプリケーションは、結果に対して何らかのロジックを実行し、そのデータをビューに表示します。たとえば、search.Twitter.comで検索を行うプログラムを作成したいとしましょう。pure Rubyを使用して、次のメソッドを作成できます。
def run(search_term='', last_id=0)
@results = []
url = URI.parse("http://search.Twitter.com")
res = Net::HTTP.start(url.Host, url.port) do |http|
http.get("/search.json?q=#{search_term}&since_id=#{last_id.to_s}")
end
@results = JSON.parse res.body
end
私はそのメソッドをプライベートメソッドとしてRailsコントローラーにドロップしたいだけですが、一部の人はこれを行うためのより良い、より多くの "Rails"の方法があると考えています。ベストプラクティスのアプローチまたはこれは本当に最良の方法ですか?
いくつかのプロジェクトで使用したHTTPartyというプラグイン/ gemがあります。
http://johnnunemaker.com/httparty/
HTTPartyを使用すると、Webサービスを簡単に利用して、結果をハッシュに解析できます。次に、ハッシュ自体を使用するか、結果を使用して1つ以上のモデルインスタンスをインスタンス化します。私はそれを両方の方法で行いました。
Twitterの例では、コードは次のようになります。
class Twitter
include HTTParty
base_uri 'Twitter.com'
def initialize(u, p)
@auth = {:username => u, :password => p}
end
# which can be :friends, :user or :public
# options[:query] can be things like since, since_id, count, etc.
def timeline(which=:friends, options={})
options.merge!({:basic_auth => @auth})
self.class.get("/statuses/#{which}_timeline.json", options)
end
def post(text)
options = { :query => {:status => text}, :basic_auth => @auth }
self.class.post('/statuses/update.json', options)
end
end
# usage examples.
Twitter = Twitter.new('username', 'password')
Twitter.post("It's an HTTParty and everyone is invited!")
Twitter.timeline(:friends, :query => {:since_id => 868482746})
Twitter.timeline(:friends, :query => 'since_id=868482746')
最後のポイントとして、上記のコードも使用できますが、コントローラーではなくモデルにコードを確実に含めることができます。
Restclient は、この問題に対する本当に素晴らしい解決策です。
require 'rest_client'
RestClient.get 'http://example.com/resource'
RestClient.get 'http://example.com/resource', {:params => {:id => 50, 'foo' => 'bar'}}
readme から。
リモートRESTful WebサービスもRuby on Railsを使用して作成された場合、 ActiveResource が最適です。
あなたのTwitterの例に対する応答として、これを自動化するのに役立つ Twitter Gem があります。
ファラデーはここで言及するに値すると思います。本当に素敵なインターフェース、およびミドルウェアの強力なコンセプト。