ruby-on-rails - practices - rails 5.2 api
¿Cuál es el "modo Rails" adecuado para consumir un servicio web RESTful en otro dominio? (5)
Creo que Faraday merece una mención aquí. Interfaz muy agradable y poderoso concepto de middleware.
Me gustaría escribir una aplicación de Ruby on Rails que consuma una API de servicio web RESTful que realiza cierta lógica en el resultado y luego muestra esa información en mi vista. Por ejemplo, digamos que quería escribir un programa que realizó una búsqueda en search.twitter.com. Usando ruby puro podría crear el siguiente método:
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
Estoy tentado de dejar caer ese método en mi controlador Rails como un método privado, pero una parte de mí piensa que hay una manera mejor y más "Rails" de hacer esto. ¿Existe un enfoque de mejores prácticas o esta es realmente la mejor manera?
En respuesta a su ejemplo de Twitter, hay una Gema de Twitter que ayudaría a automatizar esto para usted.
Hay un plugin / gem llamado HTTParty que he usado para varios proyectos.
http://johnnunemaker.com/httparty/
HTTParty le permite consumir fácilmente cualquier servicio web y analiza los resultados en un hash para usted. Luego puede usar el hash mismo o crear una instancia de una o más instancias modelo con los resultados. Lo hice de las dos maneras.
Para el ejemplo de twitter, su código se vería así:
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'')
Como último punto, también podría usar su código anterior, pero definitivamente incluya el código en un modelo en lugar de un controlador.
si el servicio web RESTful remoto también se creó con Ruby on Rails, ActiveResource es el camino a seguir.
Restclient es una solución realmente buena para este problema.
require ''rest_client''
RestClient.get ''http://example.com/resource''
RestClient.get ''http://example.com/resource'', {:params => {:id => 50, ''foo'' => ''bar''}}
Del readme .