如何使用 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】: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')
【讨论】:
【参考方案2】:如果您在代理后面进行 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
【讨论】:
【参考方案3】: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。我同意你的另一点,一个大的依赖比你需要的多,它提供的价值可能是矫枉过正的。【参考方案4】:
OpenURI 是最好的;就这么简单
require 'open-uri'
response = open('http://example.com').read
【讨论】:
请注意,open-uri
不会跟随重定向。
@yagooar 很棒,可以防止像file:///etc/passwd
这样的恶意重定向
请注意,它不会关闭连接。使用***.com/a/4217269/820501【参考方案5】:
你可以使用 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。不需要,通常不需要。【参考方案6】:我最喜欢的两种获取 URL 内容的方法是 OpenURI 或 Typhoeus。
OpenURI 因为它无处不在,而 Typhoeus 因为它非常灵活和强大。
【讨论】:
【参考方案7】:比起 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¶m2=test2。然后我需要从其他网站参数中读取并准备响应。但是如何读取参数呢? 什么意思,需要读取对方网站的参数?这怎么可能?你想达到什么目的?以上是关于如何使用 Ruby on Rails 发出 HTTP 请求?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 HSQLDB 与 Ruby on Rails 一起使用。
ruby 确定是否由机器人发出请求。来自http://stackoverflow.com/questions/5882264/ruby-on-rails-how-to-determine-if-a-r
如何在 Ruby on Rails 中查看给定 ActiveRecord 查询将生成的 SQL