【问题标题】:error!': 301 "Moved Permanently" (Net::HTTPRetriableError)错误!':301“永久移动”(Net::HTTPRetriableError)
【发布时间】:2019-01-05 07:21:24
【问题描述】:

我正在尝试使用以前用于另一台 Mac 的代码。

现在当我使用新的 Mac (2018) 运行它时,我收到以下错误

这是代码

require 'net/http'

base = 'www.uniprot.org'
tool = 'uploadlists'
params = {
  'from' => 'ACC', 'to' => 'P_REFSEQ_AC', 'format' => 'tab',
  'query' => 'P13368 P20806 Q9UM73 P97793 Q17192'
}

http = Net::HTTP.new base
$stderr.puts "Submitting...\n";
response = http.request_post '/' + tool + '/',
  params.keys.map {|key| key + '=' + params[key]}.join('&')

loc = nil
while response.code == '302'
  loc = response['Location']
  response = http.request_get loc
end

while loc
  wait = response['Retry-After'] or break
  $stderr.puts "Waiting (#{wait})...\n";
  sleep wait.to_i
  response = http.request_get loc
end

response.value # raises http error if not 2xx
puts response.body

这是我得到的错误

/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/net/http/response.rb:120:in `error!': 301 "Moved Permanently" (Net::HTTPRetriableError)
    from /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/net/http/response.rb:129:in `value'
    from conver.rb:28:in `<main>'

【问题讨论】:

    标签: ruby


    【解决方案1】:

    您会收到一个HTTP 301 Moved Permanently 响应代码。当您仔细观察时,您会发现它指向https://www.uniprot.org:443/uploadlists/ 以获得新位置;当以前可以通过 HTTP 访问的资源现在只能通过 HTTPS 访问时,通常会发生这种情况。这与使用新计算机没有任何关系;巧合的是,它发生在同一时间。

    如果您将 URL 更改为 HTTPS,它应该可以正常工作。也就是说,我从不鼓励直接使用Net::HTTP,因为它很笨重。看看how awkward it is 只是为了使用HTTPS 建立连接!这不值得头疼。

    我更喜欢使用HTTParty,因为它简单易用,并且在 Ruby 社区中非常受欢迎。下面是一个示例,说明如何使用 HTTParty 以更少的代码行完成您的任务:

    require 'httparty'
    
    params = {
      'from' => 'ACC', 'to' => 'P_REFSEQ_AC', 'format' => 'tab',
      'query' => 'P13368 P20806 Q9UM73 P97793 Q17192'
    }
    
    response = HTTParty.post(
      'https://www.uniprot.org:443/uploadlists/',
      {
        body: params.keys.map { |key| key + '=' + params[key] }.join('&'),
        headers: { 'Content-Type' => 'application/x-www-form-urlencoded' }
      }
    )
    

    然后您可以检查响应正文:

    puts response.body
    From    To
    P13368  NP_511114.2
    Q9UM73  NP_004295.2
    P97793  NP_031465.2
    Q17192  XP_004934106.1
    

    此外,我可以从您发布的堆栈跟踪中得知您正在使用 macOS 附带的系统版本的 Ruby。我的建议是:Don'tusesystem Ruby

    相反,您应该安装像 RVM 这样的 Ruby 管理器:

    • 使用\curl -sSL https://get.rvm.io | bash -s stable 安装 RVM
    • 重新加载你的 shell
    • 使用rvm install 2.5.3 安装Ruby
    • 重新安装您的 gem (gem install httparty)

    然后您可以重新运行您的应用程序。

    【讨论】:

    • 您能解释一下您创建的循环并删除了我所做的部分代码吗?我只是想学习你的方法
    • 我不明白你的问题。我没有写循环,如果我删除你写的那部分代码,它就不再工作了。您能否将您的问题重新表述得更清楚?
    猜你喜欢
    • 2017-10-27
    • 2017-09-01
    • 2019-11-04
    • 2012-07-10
    • 1970-01-01
    • 2013-09-26
    • 2019-10-14
    • 2018-06-18
    • 2018-06-23
    相关资源
    最近更新 更多