2009-04-14 4 views
54

私は、RESTful WebサービスAPIを消費するRuby on Railsアプリケーションを作成したいと思います。結果にロジックを実行し、そのデータを私のビューに表示します。たとえば、search.twitter.comで検索したプログラムを作成したいとしましょう。別のドメインでRESTful Webサービスを使用するための適切な「Rails Way」は何ですか?

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のコントローラにその方法をドロップするように誘惑していますが、私の一部は、より良い、より多くの「レール」があることを考えている:純粋なルビーを使用すると、私は次のメソッドを作成することがありますこれを行う方法。ベストプラクティスのアプローチがありますか、これは本当に最善の方法ですか?

答えて

51

私はいくつかのプロジェクトで使ってきたHTTPartyと呼ばれるプラグイン/宝石があります。

http://johnnunemaker.com/httparty/

HTTPartyあなたが簡単に任意のWebサービスを利用することができますし、あなたのためのハッシュに結果を解析します。次に、ハッシュ自体を使用するか、結果とともに1つ以上のモデルインスタンスをインスタンス化することができます。私は両方の方法でそれをやった。

さえずり例えば、あなたのコードは次のようになります。

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') 

最後のポイントとして、あなたはまた、上記のコードを使用しますが、コントローラとは対照的に、間違いなくモデルのコードを含めることができます。

+0

私はこの宝石が大好きです。これにより、Webサービスの消費が本当に滑らかになります。私がまだ持っている質問は、Railsにこれを行うために既に組み込まれているものがあるかどうかです。このように思えるのは、それをやり遂げる方法があるとしようとするのに十分なことです。 –

+0

また、私のRailsのnoobieness :)を許して、それをモデルとしてどのように設定するのですか?私は、ActiveRecordを使用したデータベースアクセス用のモデルのみを使用しました。 –

+7

レールコアには何も組み込まれていません。 モデルは単なるクラスです。モデルディレクトリにクラスを作成し、ActiveRecord:Baseクラスから継承しません。含まれているARの良さはありませんが、これはレールアプリケーション内のWebサービスを消費するための非常に一般的なパターンです –

11

リモートRESTful WebサービスもRuby on Railsで作成された場合は、ActiveResourceを使用してください。

+0

私はその仮定をすることはできません。しかし、私はActiveResourceを、私がRailsであると知っているものについて見ていきます。ありがとう! –

+4

実際には、Rails for ActiveResourceを使用してリモートRESTfulサービスを作成する必要はありません。基礎となる実装は重要ではありません。 – WattsInABox

+0

これは間違いなく、RESTfulなリソースを消費するRailsの好ましい方法です。コードをきれいに保ち、MVCに準拠します。 –

2

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

23

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

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

readmeより。

+1

私はRestClientと強く同意します。これは本当にすべてのAPIコールを処理するためのすばらしいフレームワークです。 – mhenrixon

+0

優れたもの。 iOSから来て、これはまさに私が欲しかったものです。 – samvermette

+1

私はRestClientからHTTPartyを強く好みます。私には魔法のような、より根本的な感じがします。 YMMV – Duke

1

ファラデーはここで言及するに値すると思います。本当に素敵なインターフェース、強力なミドルウェアのコンセプト。私は基本的な枠組みがどうなるか分からないでしょうここで、多くの異なるウェブサイトからデータを取得したいと

https://github.com/lostisland/faraday