【问题标题】:Check on the status code of url before redirect_to in controller rails在控制器 rails 中的 redirect_to 之前检查 url 的状态码
【发布时间】:2014-08-09 15:44:14
【问题描述】:

我在instances_controller 中有操作check_status,我想在redirect_to 之前检查URL 的状态代码。

如果status_code 是 200 redirect_to 它,否则转到查看页面。

这是check_status动作的伪代码:

def check_status
  if "http://www.web.com".status_code == 200
    redirect_to "http://www.web.com"
  else
    #DO Nothing, and go to its view
  end
end

例如get '/about' => 'instances#check_status',我想检查(web.com)是否得到status=200访问(web.com)

【问题讨论】:

  • 你能解释一下用例吗?它会让问题更清楚

标签: ruby-on-rails database redirect http-status-codes


【解决方案1】:

您可以这样做 - 但请注意:

  1. 您的用户必须等待您的响应检查完成,然后才能被重定向。如果您检查的是慢速服务器,则可能需要 30 秒才能将它们发送到其他地方。
  2. 无法保证用户会得到与您检查时相同的结果。

下面是一些使用Ruby's Net::HTTP module 执行该网络请求的代码:

require 'net/http'

def check_status(url)
  uri = URI(url)
  Net::HTTP.start(uri.host, uri.port) do |http|
    request = Net::HTTP::Head.new uri.request_uri
    response = http.request request

    if response == Net::HTTPSuccess
      redirect_to url and return
    end
  end
end

确保您将完整的 URL 传递给此方法,并带有 http://https:// 前缀,否则这将不起作用。

如果您担心性能受到影响,可以将结果缓存一小段时间,然后在返回之前检查这些结果。也就是说,当您查找 URL 时,您可以节省查找时间和检索到的状态代码。然后,在下一次查找时,如果您在过去 24 小时内检查过该域,请立即返回重定向而不是再次检查。

【讨论】:

  • 我从你的代码中得到了这个错误(未定义的方法 `request_uri' 用于#<:generic:0x00000002f96e90 url:www.google.com>)
  • 该错误来自您的数据,而不是来自我的代码。 :) 如果您不指定协议,uri 模块将构造一个通用 URI。您需要一个 HTTP URI。也就是说,URI('www.google.com') 返回一个URI::Genericobject(它没有request_uri 方法)。 URI('http://www.google.com/') 返回一个 URI::HTTP 对象,它工作正常。我会在我原来的答案中添加一个注释来标记这个。
【解决方案2】:

对我来说,只有这个正在检查响应

== 不匹配...

response.is_a? Net::HTTPSuccess

【讨论】:

  • 在文档中也是这样写的。所以也许编辑答案。
【解决方案3】:

除了Alex的回答,你可以使用curl工具代替Net::HTTP模块。

system('curl www.google.com') # =&gt; true

system('curl www.google_not_valid.com') # =&gt; false

【讨论】:

  • system('curl www.google_not_valid.com') 返回 true
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
相关资源
最近更新 更多