Ruby on Railsを使用してHTTPリクエストを行う方法


235

別のウェブサイトから情報を入手したいと思います。したがって、(たぶん)そのウェブサイトにリクエストを送信し(私の場合はHTTP GETリクエスト)、レスポンスを受信する必要があります。

Ruby on Railsでこれを作成するにはどうすればよいですか?

可能であれば、コントローラーで使用するのは正しいアプローチですか?

回答:


330

RubyのNet::HTTPクラスを使用できます。

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

1
ここで「必須」とはどういう意味ですか?
sixty4bit 2014

18
それはリクエストを意味します
ArthurCollé2014年

1
これはブロッキングリクエストのように見えますが、違いますか?
スコットアイゼンバーグ

apiキーをどこに置くか?
user1735921

1
wwwを追加するだけです。通常は必要ありません。
JackHasaKeyboard 2016年

111

Net :: HTTPはRubyに組み込まれていますが、正直なところ、厄介な1980年代スタイルを使用せに、より高いレベルの代替手段を試す方が簡単な場合が多いです。


4
または、Railsに付属するActiveResource!
Marnen Laibow-Koser

8
Railsアプリに依存関係を追加することになるので、そうしないように注意してください。より多くの依存関係はより多くのメモリ消費を意味し、潜在的により大きな攻撃面も意味します。使用するのNet::HTTPは面倒ですが、トレードオフの価値はありません。
Jason Yeo

3
これは受け入れられる答えになるはずです。たくさんの宝石をインストールできるのに、なぜプログラムするのですか?
2017年

5
@JasonYeoまったくそう思わない。依存関係を導入することは、車輪を再発明しないことを意味し、他の人がすでに行ったハードワークから利益を得ます。あなたの人生を楽にする宝石が存在する場合、それを使わない理由は通常ありません。
Marnen Laibow-Koser

1
@JasonYeoレフトパッドサガが発生したのは、NPMがリポジトリを適切に実行せず、作成者にすべてのパッケージを削除させたためです。適切に管理されたパッケージリポジトリはそれを行いません(とにかく、それはOSSなので、必要に応じて簡単にミラーリングできます)。つまり、レフトパッドサガは、一般的に依存関係を導入することに反対するものではなく、リポジトリを適切に管理しないことに反対するものです。私はあなたの他の点に同意します、あなたが必要以上に多くをする大きな依存関係はそれが提供する価値のためにやり過ぎであるかもしれないということです。
Marnen Laibow-Koser

92

OpenURIが最適です。それはと同じくらい簡単です

require 'open-uri'
response = open('http://example.com').read

10
open-uriリダイレクトに追随しないことを警告することが重要です。
yagooar 2014年

3
@yagooarは素晴らしいです。次のような悪意のあるリダイレクトを防止しますfile:///etc/passwd
gertas

1
接続は切断されませんのでご注意ください。stackoverflow.com/a/4217269/820501を
ShockwaveNN


13

私はNet :: HTTP よりもhttpclientを好みます。

client = HTTPClient.new
puts client.get_content('http://www.example.com/index.html')

HTTPartyは、サービスのクライアントであるクラスを作成する場合に適しています。必要なものの90%を提供する便利なミックスインです。例では、GoogleとTwitterクライアントがどれだけ短いかをご覧ください。

そして、2番目の質問に答えます。いいえ、この機能をコントローラーに配置しません。可能であれば、代わりにモデルを使用して(おそらくHTTPartyを使用して)詳細をカプセル化し、コントローラーから呼び出します。


そして、どのようにしてURLでパラメータを安全に渡すことができますか?例:http://www.example.com/index.html?param1 = test1&param2 = test2。次に、他のWebサイトのパラメーターから読み取り、応答を準備する必要があります。しかし、どうすればパラメータを読み取ることができますか?
user502052 2011年

どういう意味ですか、他のウェブサイトのパラメータを読む必要がありますか?それはどのようにして可能でしょうか?何を達成しようとしていますか?
Marnen Laibow-Koser

8

URLのコンテンツを取得する私のお気に入りの2つの方法は、OpenURIまたはTyphoeusです。

OpenURIはどこにでもあるので、Typhoeusは非常に柔軟で強力なためです。


8

プロキシの背後で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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.