Consumir API no REST en Rails con ActiveResource

Estoy escribiendo un cliente que consume una API que no es REST (es decir, GET site.com/gettreasurehunts), que requiere que especifique todos los parámetros (incluso el ID de recurso) en el cuerpo HTTP de la solicitud como un documento XML personalizado. Me gustaría usar Rails y ActiveResource, pero me vería obligado a reescribir casi todos los métodos de ActiveResource.

¿Hay otra forma más pulida de lograr el mismo resultado, incluso utilizando otro marco (Ruby)?

No creo que haya una manera de hacer esto con ActiveResource, para estos casos solo uso Net :: HTTP y Nokogiri

Recomendaría HTTParty , es bastante flexible y estoy seguro de que es capaz de manejar lo que necesita.

Algunos ejemplos del proyecto:

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) 

Y si necesita POSTAR algo en el cuerpo de la solicitud, simplemente agregue: body => “text” al hash de opciones.

Es muy sencillo trabajar con él y actualmente lo estoy usando en lugar de ActiveResource para consumir algunos servicios REST de una aplicación Rails.

Respuesta simple, no lo hagas. Tuve un problema similar con ActiveResource, no me gustaba la API de HTTParty (demasiados métodos de clase), así que hice mi propia. Pruébalo, se llama Wrest . Tiene soporte parcial para Curl y deserialización a través de REXML, LibXML, Nokogiri y JDom fuera de la caja. Puedes escribir trivialmente tu propio deserializador también.

Aquí hay un ejemplo para la api Delicious:

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