Использование не-REST API в Rails с ActiveResource

Я пишу клиент, который использует не-REST API (например, GET site.com/gettreasurehunts), который требует, чтобы я указал все параметры (даже идентификатор ресурса) в теле HTTP-запроса в виде пользовательского XML-документа. Я хотел бы использовать Rails и ActiveResource, но мне пришлось бы переписать почти все методы ActiveResource.

Есть ли другой, более совершенный способ добиться того же результата, даже используя другой (Ruby) фреймворк?


person asymmetric    schedule 01.07.2009    source источник


Ответы (3)


Я не думаю, что есть способ сделать это с помощью ActiveResource, для этих случаев я просто использую Net::HTTP и Nokogiri.

person Omar Qureshi    schedule 01.07.2009

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

Несколько примеров из проекта:

pp HTTParty.get('http://whoismyrepresentative.com/whoismyrep.php?zip=46544')
pp HTTParty.get('http://whoismyrepresentative.com/whoismyrep.php', :query => {:zip => 46544})

@auth = {:username => u, :password => p}
options = { :query => {:status => text}, :basic_auth => @auth }
HTTParty.post('http://www.twitter.com/statuses/update.json', options)

И если вам нужно отправить что-то в тело запроса, просто добавьте :body => "text" к хешу опций.

С ним очень просто работать, и в настоящее время я использую его вместо ActiveResource для использования некоторых REST-сервисов из приложения Rails.

person mwilliams    schedule 01.07.2009
comment
после того, как я попробовал HTTParty, я обнаружил, что у него есть несколько действительно неприятных ошибок (см. мои вопросы для получения дополнительной информации), и я решил вместо этого использовать Net::HTTP. все равно спасибо за ответ! - person asymmetric; 04.07.2009

Простой ответ, не надо. У меня была аналогичная проблема с ActiveResource, мне не нравился API HTTParty (слишком много методов класса), поэтому я накатил свой собственный. Попробуйте, это называется Wrest. Он имеет частичную поддержку Curl и десериализацию через REXML, LibXML, Nokogiri и JDom из коробки. Вы также можете тривиально написать свой собственный десериализатор.

Вот пример для Delicious API:

class Delicious
  def initialize(options)
    @uri = "https://api.del.icio.us/v1/posts".to_uri(options)
  end

  def bookmarks(parameters = {})
    @uri['/get'].get(parameters)
  end

  def recent(parameters = {})
    @uri['/recent'].get(parameters)
  end

  def bookmark(parameters)
    @uri['/add'].post_form(parameters)
  end

  def delete(parameters)
    @uri['/delete'].delete(parameters)
  end
end

account = Delicious.new :username => 'kaiwren', :password => 'fupupp1es'
account.bookmark(
    :url => 'http://blog.sidu.in/search/label/ruby',
    :description => 'The Ruby related posts on my blog!',
    :extended => "All posts tagged with 'ruby'",
    :tags => 'ruby hacking'
  )
person Kai Wren    schedule 16.02.2010