【问题标题】:Alllow for "bad" urls in in Rails在 Rails 中允许“坏”的 url
【发布时间】:2012-07-19 07:19:43
【问题描述】:

我有一个简单的脚本来检查错误的 url:

def self.check_prod_links
  require 'net/http'
  results = []
  Product.find_each(:conditions =>{:published => 1}) do |product|
    url = product.url 
    id = product.id
    uri = URI(url)
    begin
      response = Net::HTTP.get_response(uri)
    rescue
      begin
        http = Net::HTTP.new(uri.host, uri.port)
        http.use_ssl = true
        http.verify_mode = OpenSSL::SSL::VERIFY_NONE
        request = Net::HTTP::Get.new(uri.request_uri)
        response = http.request(request)
      rescue
        begin
          response = Net::HTTP.get_response("http://" + uri)  
        rescue => e
          p "Problem getting url: #{url} Error Message: #{e.message}"
        end
      end
    end
    p "Checking URL = #{url}. ID = #{id}. Response Code = #{response.code}" 
    unless response.code.to_i == 200
      product.update_attribute(:published, 0) 
      results << product
    end
  end
  return results
end

我怎样才能允许格式不正确的网址,例如:hkbfksrhf.google.com 以不使脚本崩溃并出现以下错误:

getaddrinfo:节点名或服务名提供,或未知

我只想让任务运行到最后,并打印任何/所有不是 200 和 301 http 响应的错误。

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 net-http


    【解决方案1】:

    open-uri 是一个选项吗?它在遇到 404 或 500(或其他 HTTP 异常)时抛出异常,除了 SocketErrors,它允许您稍微清理一下代码

    def self.check_prod_links                                            
      require 'open-uri'                                                 
      results = []                                                       
    
      Product.where(:published => 1).each do |product|                   
        url = product.url                                               
        id = product.id                                                  
        failed = true                                                    
    
        begin                                                            
          open URI(url)                                                  
          failed = false                                                 
        rescue OpenURI::HTTPError => e                                   
          error_message = e.message                                      
          response_message = "Response Code = #{e.io.status[0]}"         
        rescue SocketError => e                                          
          error_message = e.message                                      
          response_message = "Host unreachable"                          
        rescue => e                                                      
          error_message = e.message                                      
          response_message = "Unknown error"                             
        end                                                              
    
        if failed                                                        
          Rails.logger.error "Problem getting url: #{url} Error Message: #{error_message}"
          Rails.logger.error "Checking URL = #{url}. ID = #{id}. #{response_message}".    
    
          product.update_attribute(:published, 0).                       
          results << product                                             
        end                                                              
      end                                                                
    
      results                                                          
    end                                                                  
    

    【讨论】:

    • 我正在通过 rake 任务运行此方法。您是否知道即使 URL 无效也可以继续运行任务并仅记录错误 url 并继续运行的方法?检查错误 url 时出现以下错误:“获取 url 时出现问题:bkjfbjkbfjkwbfjrwkbf.gifts.redenvelope.com/orchids/… 错误消息:getaddrinfo:提供节点名或服务名,或未知”rake 中止!
    • 你试过我提供的更新方法了吗?它应该捕获输出“getaddrinfo”消息的 SocketError 并继续。如果要记录到文件,可以使用记录器(例如 Rails.logger.error "#{response_message}")而不是使用 p 输出到标准输出
    • 是的,即使使用您提供的方法,我仍然会收到无效 URL 的错误。非常感谢您的帮助
    • 这很奇怪,考虑到最后一个通用救援应该会捕捉到任何意想不到的东西。我怀疑您的 Product 模型中可能有一个回调,它可能试图做某事并引发异常。您可以尝试评论# product.update_attribute(:published, 0) 以查看 rake 任务是否仍在抛出异常?
    • 仍然出现错误。我从数据库中的第一条记录中删除了 http://,然后运行了该方法,这是我收到的异常:“获取 url 的问题:www.gifts.redenvelope.com/flowers/Chocolate-Vanilla--Red- Velvet-Cupcakes--12-Cou-and-other-chocolates--gifts--Sharis-Berries-30006042?ref=HomeNoRef&viewpos=8&trackingpgroup=rbdbs 错误消息:无法将 URI::Generic 转换为字符串”rake 中止!也仍然不适用于无效的网址。
    猜你喜欢
    • 2010-12-16
    • 2017-07-05
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    相关资源
    最近更新 更多