他のウェブサイトから情報を取りたいのですが。したがって(多分)私はそのウェブサイトにリクエストをし(私の場合はHTTP GETリクエスト)、レスポンスを受け取るべきです。
Ruby on Railsでこれを行うにはどうすればいいですか?
それが可能であるならば、それは私のコントローラーで使うのが正しいアプローチですか?
Rubyの Net::HTTP
classを使うことができます。
require 'net/http'
url = URI.parse('http://www.example.com/index.html')
req = Net::HTTP::Get.new(url.to_s)
res = Net::HTTP.start(url.Host, url.port) {|http|
http.request(req)
}
puts res.body
Net :: HTTPはRubyに組み込まれていますが、直面してみましょう。面倒な1980年代のスタイルを使用してより高レベルの代替手段を試すほうが簡単ではないことがよくあります。
OpenURIが最高です。それはとても簡単です
require 'open-uri'
response = open('http://example.com').read
require 'net/http'
result = Net::HTTP.get(URI.parse('http://www.example.com/about.html'))
# or
result = Net::HTTP.get(URI.parse('http://www.example.com'), '/about.html')
Net :: HTTPよりも httpclient を好む.
client = HTTPClient.new
puts client.get_content('http://www.example.com/index.html')
あなたがサービスのクライアントであるクラスを作っているならHTTPartyは良い選択です。それはあなたがあなたが必要とするものの90%を与える便利なミックスインです。グーグルとツイッターのクライアントが 例 にどれだけ近いかを見てください。
そして、あなたの2番目の質問に答えるために:いいえ、私はコントローラにこの機能を入れないでしょう - 可能であれば私は代わりにモデルを使って(おそらくHTTPartyを使って)そして単にコントローラからそれを呼び出すでしょう。
これは、プロキシの内側でREST api呼び出しを行っている場合に機能するコードです。
require "uri"
require 'net/http'
proxy_Host = '<proxy addr>'
proxy_port = '<proxy_port>'
proxy_user = '<username>'
proxy_pass = '<password>'
uri = URI.parse("https://saucelabs.com:80/rest/v1/users/<username>")
proxy = Net::HTTP::Proxy(proxy_Host, proxy_port, proxy_user, proxy_pass)
req = Net::HTTP::Get.new(uri.path)
req.basic_auth(<sauce_username>,<sauce_password>)
result = proxy.start(uri.Host,uri.port) do |http|
http.request(req)
end
puts result.body
Nice_http gemを使う https://github.com/MarioRuiz/Nice_http
あなたは一行でそれを行うことができます:
require 'Nice_http'
content = NiceHttp.new("http://www.example.com").get("/index.html").data