Каков правильный "Rails Way" для использования веб-службы RESTful в другом домене?
Я хотел бы написать приложение 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 как частный метод, но часть меня думает, что есть лучший, более "Rails" способ сделать это. Есть ли подход с лучшей практикой или это действительно лучший способ?
Ответы
Ответ 1
Существует плагин/драгоценный камень, называемый 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 an HTTParty and everyone is invited!")
twitter.timeline(:friends, :query => {:since_id => 868482746})
twitter.timeline(:friends, :query => 'since_id=868482746')
В качестве последнего пункта вы также можете использовать свой код, но обязательно укажите код в модели, а не контроллер.
Ответ 2
Restclient - действительно хорошее решение этой проблемы.
require 'rest_client'
RestClient.get 'http://example.com/resource'
RestClient.get 'http://example.com/resource', {:params => {:id => 50, 'foo' => 'bar'}}
Из readme.
Ответ 3
если удаленная веб-служба RESTful также была создана с помощью Ruby on Rails, ActiveResource - это путь.
Ответ 4
В ответ на ваш пример Twitter есть Twitter Gem, который поможет автоматизировать это для вас.
Ответ 5
Я думаю, что Фарадей заслуживает упоминания здесь. Действительно приятный интерфейс и мощная концепция промежуточного ПО.
https://github.com/lostisland/faraday