2009-07-01 6 views
4

J'écris un client qui consomme une API non-REST (ie GET site.com/gettreasurehunts), ce qui nécessite que je spécifie tous les paramètres (même l'ID de ressource) dans le le corps HTTP de la requête en tant que document XML personnalisé. Je voudrais utiliser Rails et ActiveResource, mais je serais obligé de réécrire presque toutes les méthodes d'ActiveResource.Consommation d'API non-REST dans Rails avec ActiveResource

Existe-t-il un autre moyen plus perfectionné d'obtenir le même résultat, même en utilisant un autre cadre (Ruby)?

Répondre

3

Je ne pense pas qu'il y ait un moyen de le faire avec ActiveResource, pour ces cas, je viens d'utiliser le Net :: HTTP et Nokogiri

3

Je recommande HTTParty, il est assez souple et je suis sûr capable de gérer ce dont vous avez besoin.

Quelques exemples du projet:

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) 

Et si vous avez besoin de quelque chose dans le POST corps de la demande, il suffit d'ajouter: body => « texte » au hachage des options.

Il est très simple de travailler avec et je l'utilise actuellement à la place d'ActiveResource pour consommer certains services REST à partir d'une application Rails.

+0

après avoir essayé HTTParty, je l'ai trouvé a quelques bugs vraiment méchant (regardez mes questions pour plus d'informations), et je l'ai décidé d'aller avec Net: : HTTP à la place. merci quand même pour la réponse! – asymmetric

1

Réponse simple, non. J'ai eu un problème similaire avec ActiveResource, je n'ai pas aimé l'API de HTTParty (trop de méthodes de classe), donc j'ai roulé la mienne. Essayez-le, il s'appelle Wrest. Il supporte partiellement Curl et la désérialisation via REXML, LibXML, Nokogiri et JDom. Vous pouvez aussi écrire votre propre désérialiseur.

Voici un exemple pour l'api délicieux:

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