我正在尝试使用以前与另一台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>'
答案 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 install 2.5.3
gem install httparty
)然后您可以重新运行您的应用程序。