Как правильно использовать Rails Way для использования веб-службы RESTful в другом домене? - PullRequest
55 голосов
/ 14 апреля 2009

Я хотел бы написать приложение Ruby on Rails, которое использует API веб-службы RESTful, выполняет некоторую логику результата и затем отображает эти данные в моем представлении. Например, скажем, я хотел написать программу, которая выполняла поиск на search.twitter.com. Используя чистый 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" способ сделать это. Есть ли лучший подход или это действительно лучший способ?

Ответы [ 5 ]

53 голосов
/ 14 апреля 2009

Существует плагин / гем под названием HTTParty, который я использовал для нескольких проектов.

http://johnnunemaker.com/httparty/

HTTParty позволяет вам легко использовать любой веб-сервис и анализировать результаты для вас. Затем вы можете использовать сам хеш или создать один или несколько экземпляров модели с результатами. Я сделал это в обе стороны.

Для примера в Твиттере ваш код будет выглядеть так:

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

В качестве последнего пункта вы также можете использовать приведенный выше код, но обязательно включите его в модель, а не в контроллер.

26 голосов
/ 28 сентября 2012

Restclient - действительно хорошее решение этой проблемы.

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

Из readme .

11 голосов
/ 14 апреля 2009

, если удаленная веб-служба RESTful была также создана с помощью Ruby on Rails, ActiveResource - это путь.

3 голосов
/ 14 апреля 2009

В ответ на ваш пример в Twitter есть Twitter Gem , который поможет автоматизировать это для вас.

1 голос
/ 29 июля 2015

Я думаю, что Фарадей заслуживает упоминания здесь. Действительно приятный интерфейс и мощная концепция промежуточного программного обеспечения.

https://github.com/lostisland/faraday

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...