如何使用 Ruby on Rails 发出 HTTP 请求?

Posted

技术标签:

【中文标题】如何使用 Ruby on Rails 发出 HTTP 请求?【英文标题】:How to make a HTTP request using Ruby on Rails? 【发布时间】:2011-06-02 15:18:10 【问题描述】:

我想从另一个网站获取信息。因此(也许)我应该向该网站发出请求(在我的情况下是 HTTP GET 请求)并接收响应。

如何在 Ruby on Rails 中实现这一点?

如果可能的话,这是在我的控制器中使用的正确方法吗?

【问题讨论】:

【参考方案1】:

你可以使用 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

【讨论】:

这里的“req”是什么意思? 看起来这可能是一个阻塞请求,不是吗? api密钥放哪里? @João Silva 如何为我的请求设置超时? 只需添加 www。不需要,通常不需要。【参考方案2】:

Net::HTTP 内置于 Ruby 中,但让我们面对现实吧,使用其 1980 年代繁琐的风格并尝试更高级别的替代方案通常更容易而不是

HTTP Gem HTTParty RestClient Excon Feedjira (仅限 RSS)

【讨论】:

或者是Rails自带的ActiveResource! 我想提醒您不要这样做,因为您将向您的 Rails 应用程序添加更多依赖项。更多的依赖意味着更多的内存消耗和潜在的更大的攻击面。使用 Net::HTTP 很麻烦,但折衷是不值得的。 这应该是公认的答案。既然可以安装大量 Gem,为什么还要编程? @JasonYeo 强烈反对。引入依赖项意味着您无需重新发明***,并且您可以从其他人已经完成的辛勤工作中受益。如果存在可以让您的生活更轻松的宝石,那么通常没有充分的理由不使用它。 @JasonYeo 之所以会发生 leftpad 传奇,是因为 NPM 运行它的存储库很糟糕,让作者删除了他所有的包。正确管理的包 repos 不会这样做(无论如何,它是 OSS,所以如果你愿意,你可以轻松地镜像)。也就是说,leftpad 传奇一般不是反对引入依赖项的论据,而是反对糟糕地管理 repo。我确实同意你的另一点,即一个比你需要的大的依赖关系对于它提供的价值来说可能是矫枉过正的。【参考方案3】:

OpenURI 是最好的;就这么简单

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

【讨论】:

请注意,open-uri 不会跟随重定向。 @yagooar 很棒,可以防止像file:///etc/passwd这样的恶意重定向 请注意,它不会关闭连接。使用***.com/a/4217269/820501【参考方案4】:
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')

【讨论】:

【参考方案5】:

比起 Net::HTTP,我更喜欢 httpclient。

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

如果您正在创建一个作为服务客户端的类,HTTParty 是一个不错的选择。这是一个方便的 mixin,可以满足您 90% 的需求。在examples 中查看 Google 和 Twitter 客户端有多短。

回答你的第二个问题:不,我不会把这个功能放在控制器中——如果可能的话,我会使用模型来封装细节(可能使用 HTTParty)并简单地从控制器中调用它。

【讨论】:

如何在 URL 中安全地传递参数?例如:http://www.example.com/index.html?param1=test1&param2=test2。然后我需要从其他网站参数中读取并准备响应。但是如何读取参数呢? 什么意思,需要读取对方网站的参数?这怎么可能?你想达到什么目的?【参考方案6】:

我最喜欢的两种获取 URL 内容的方法是 OpenURI 或 Typhoeus。

OpenURI 因为它无处不在,而 Typhoeus 因为它非常灵活和强大。

【讨论】:

【参考方案7】:

如果您在代理后面进行 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

【讨论】:

以上是关于如何使用 Ruby on Rails 发出 HTTP 请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 HSQLDB 与 Ruby on Rails 一起使用。

Ruby on Rails 同时发出多个 HTTP 请求?

ruby 确定是否由机器人发出请求。来自http://stackoverflow.com/questions/5882264/ruby-on-rails-how-to-determine-if-a-r

如何在 Ruby on Rails 中查看给定 ActiveRecord 查询将生成的 SQL

部署 Ruby on Rails - Heroku 有没有好的替代方案? [关闭]

Ruby On Rails:获取回形针图像的 md5 哈希