web-dev-qa-db-ja.com

別のドメインでRESTful Webサービスを使用するための適切な「レールウェイ」とは何ですか?

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"の方法があると考えています。ベストプラクティスのアプローチまたはこれは本当に最良の方法ですか?

55
Mike Farmer

いくつかのプロジェクトで使用した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')

最後のポイントとして、上記のコードも使用できますが、コントローラーではなくモデルにコードを確実に含めることができます。

53
Kyle Boon

Restclient は、この問題に対する本当に素晴らしい解決策です。

require 'rest_client'
RestClient.get 'http://example.com/resource'
RestClient.get 'http://example.com/resource', {:params => {:id => 50, 'foo' => 'bar'}}

readme から。

26
Ethan Heilman

リモートRESTful WebサービスもRuby on Railsを使用して作成された場合、 ActiveResource が最適です。

11
Adam Alexander

あなたのTwitterの例に対する応答として、これを自動化するのに役立つ Twitter Gem があります。

3
Adam Alexander

ファラデーはここで言及するに値すると思います。本当に素敵なインターフェース、およびミドルウェアの強力なコンセプト。

https://github.com/lostisland/faraday

1
Duke