【问题标题】:Check if webpage is online, with Ruby使用 Ruby 检查网站是否在线
【发布时间】:2019-12-09 19:59:29
【问题描述】:

使用curl,我执行以下操作来检查网页是否在线:

if curl --output /dev/null --silent --head --fail "${url}"; then
  echo "URL exists: ${url}"
else
  echo "URL does not exist: ${url}"
fi

但是,如果服务器拒绝HEAD 请求(或者我不知道),另一种方法是只请求文件的第一个字节:

if curl --output /dev/null --silent --fail --range 0-0 "${url}"; then
  echo "URL exists: ${url}"
else
  echo "URL does not exist: ${url}"
fi

第一种情况很容易在 Ruby 中复制:

require 'net/http'
require 'uri'

uri = URI.parse(url)
response = Net::HTTP.get_response(uri)

if response.kind_of? Net::HTTPOK
  puts "URL exists: #{url}"
else
  puts "URL does not exist: #{url}"
end

如何复制第二个curl 案例?

【问题讨论】:

  • 你可以使用'curb'之类的东西(需要libcurl),但简而言之是stackoverflow.com/q/82349/438992
  • kind_of? 比较对象的类,而不是对象本身。考虑:case (response),然后是 when Net::HTTPOK,它涵盖了更多案例。
  • @tadman 你能扩展一下吗?我从stackoverflow.com/a/12023273/1661012获取response.kind_of?代码
  • 这是一种更丑陋的方式来做 tantrix 下面的答案。
  • @tadman “丑陋”是相对的。 kind_of? 允许签入一行:puts "URL exists: #{url}" if response.kind_of? Net::HTTPOK

标签: ruby curl


【解决方案1】:

范围选项基本上只设置Range 标头。所以要复制你也会这样做:

url = URI.parse(...)

req = Net::HTTP::Get.new(url.request_uri)
req['Range'] = 'bytes=0-0'

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = (url.scheme == "https")

response = http.request(req)

【讨论】:

  • 我想知道这个可以缩短吗?在 bash 示例中,这样做只是一个额外的标志。但在 Ruby 中,这是额外的四行,包括创建两个额外的变量。这可能是最短的,但仍然正确?
  • 使用 Net::HTTP 没有更短的方法。我查看了文档,这是我能找到的最紧凑的形式。但是,如果您使用其他 gem,那么您可能会使其更短。 HTTParty 或 Faraday 是几个可以用 1 到 2 行代码完成此操作的 gem。
  • 但当然没有什么能阻止您围绕此代码编写自己的方法包装器。然后你就可以一行完成了。
猜你喜欢
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多