2009-07-01 1 views
4

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

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

ответ

3

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

3

Я бы порекомендовал 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) 

И если вам нужно POST-то в теле запроса, просто добавьте: тело => «текст» в хэш опций.

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

+0

после попытки HTTParty, я нашел, что это имеет некоторые действительно неприятные ошибки (смотрите на мои вопросы для получения дополнительной информации), и я решил пойти с Net: : HTTP вместо этого. спасибо в любом случае за ответ! – asymmetric

1

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

Вот пример для Вкусного 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' 
)