错误!”:301“永久移动”(Net :: HTTPRetriableError)

时间:2019-01-04 21:40:11

标签: ruby

我正在尝试使用以前与另一台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>'

1 个答案:

答案 0 :(得分:1)

您将收到HTTP 301 Moved Permanently响应代码。当您靠近时,可以看到它指向您指向新位置的https://www.uniprot.org:443/uploadlists/;当以前只能通过HTTPS访问以前可以通过HTTP访问的资源时,通常会发生这种情况。它与使用新计算机无关。巧合的是,它大约在同一时间发生。

如果将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't use system Ruby

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

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

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