Что такое правильный "Rails Way" для использования RESTful web service в другом домене?
Я хотел бы написать приложение Ruby on Rails, которое использует API веб-службы RESTful, выполняет некоторую логику в результате, а затем отображает эти данные на моем представлении. Например, предположим, что я хотел написать программу, которая выполняла поиск search.twitter.com. используя чистый Рубин я мог бы создать следующий метод:
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 как частный метод, но часть меня думает, что есть лучший, более "рельсовый" способ сделать это. Есть ли лучший подход или это действительно лучший способ?
5 ответов:
есть плагин / gem под названием HTTParty, который я использовал для нескольких проектов.
http://johnnunemaker.com/httparty/
HTTParty позволяет легко использовать любой веб-сервис и анализирует результаты в хэш для вас. Затем вы можете использовать сам хэш или создать один или несколько экземпляров модели с результатами. Я сделал это в обоих направлениях.
для примера, 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 также был создан с Ruby on Rails,ActiveResource - это путь.
в ответ на ваш пример Twitter, есть Twitter Gem это поможет автоматизировать это для вас.