【问题标题】:404 error with open-uri in a rake task... what's causing it?rake 任务中的 open-uri 出现 404 错误...是什么原因造成的?
【发布时间】:2011-09-21 06:03:48
【问题描述】:

我有一个 rake 任务,它从 API 获取 JSON 数据,对其进行解析,然后将其保存到数据库中:

task :embedly => :environment do
  require 'json'
  require 'uri'
  require 'open-uri'

  Video.all.each do |video|
    json_stream = open("http://api.embed.ly/1/oembed?key=08b652e6b3ea11e0ae3f4040d3dc5c07&url=#{video.video_url}&maxwidth=525")
    ruby_hash = JSON.parse(json_stream.read)
    thumbnail_url = ruby_hash['thumbnail_url']
    embed_code = ruby_hash['html']
    video.update_attributes(:thumbnail_url => thumbnail_url, :embed_code => embed_code)
  end  
end

我在运行 rake 任务时在堆栈跟踪中收到此错误,但我不知道是什么原因造成的:

rake aborted!
404 Not Found
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:277:in `open_http'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:616:in `buffer_open'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:164:in `open_loop'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `catch'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `open_loop'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:132:in `open_uri'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:518:in `open'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:30:in `open'
/rubyprograms/dreamstill/lib/tasks/tasks.rake:16
/rubyprograms/dreamstill/lib/tasks/tasks.rake:15:in `each'
/rubyprograms/dreamstill/lib/tasks/tasks.rake:15
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `call'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `execute'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `each'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `execute'
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:597:in `invoke_with_call_chain'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/monitor.rb:242:in `synchronize'

关于这个问题的任何想法以及如何解决它?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 debugging rake open-uri


    【解决方案1】:

    如果指定的资源(视频/图片)不存在,则 embed.ly api 返回 404。 OpenURI 将其作为例外处理。要捕获错误,您可以执行以下操作:

    task :embedly => :environment do
      require 'json'
      require 'uri'
      require 'open-uri'
    
      Video.all.each do |video|
        begin
          json_stream = open("http://api.embed.ly/1/oembed?key=08b652e6b3ea11e0ae3f4040d3dc5c07&url=#{video.video_url}&maxwidth=525")
          ruby_hash = JSON.parse(json_stream.read)
          thumbnail_url = ruby_hash['thumbnail_url']
          embed_code = ruby_hash['html']
          video.update_attributes(:thumbnail_url => thumbnail_url, :embed_code => embed_code)
        rescue OpenURI::HTTPError => ex
          puts "Handle missing video here"
        end 
      end  
    end
    

    您还可以在运行任务之前检查视频/网址是否有效。

    【讨论】:

    • 知道如何打印出 404 的 url 吗?
    【解决方案2】:

    您没有对您的video.url 进行 URL 编码:

    json_stream = open("...url=#{video.video_url}...")
    

    所以您可能正在生成一个损坏的 URL,而 api.embed.ly 告诉您它找不到它。例如,如果video.video_urlhttp://a.b?c=d&e=f,那么e=f 将被视为http://api.embed.ly/1/oembed 的参数,而不是传递给http://a.b

    您可能想要这样做:

    require 'cgi'
    #...
    json_stream = open("...url=#{CGI.escape(video.video_url)}...")
    

    【讨论】:

      猜你喜欢
      • 2022-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 2015-01-07
      • 2021-12-30
      • 1970-01-01
      • 2013-02-23
      相关资源
      最近更新 更多