error! ': 301 "Перемещено навсегда" (Net :: HTTPRetriableError) - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь использовать код, который я использовал для другого 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 голосов
/ 05 января 2019

Вы получаете код ответа HTTP 301, постоянно перемещенный . Когда вы смотрите поближе, вы видите, что он указывает на https://www.uniprot.org:443/uploadlists/ для нового местоположения; это то, что обычно происходит, когда ресурс, который раньше был доступен через HTTP, теперь доступен только через HTTPS. Это не имеет ничего общего с использованием нового компьютера; просто случайно это произошло примерно в одно и то же время.

Если вы измените URL на HTTPS, он должен работать так, как вы ожидаете. Тем не менее, я никогда не рекомендую использовать Net::HTTP напрямую, потому что это неуклюже. Посмотрите на , как неловко просто установить соединение, используя 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

Кроме того, по трассировке стека я могу сказать, что вы опубликовали, что вы используете системную версию Ruby, поставляемую с macOS. Мой совет: Не Используйте Система Ruby .

Вместо этого вы должны установить менеджер Ruby, например RVM :

  • Установить RVM с \curl -sSL https://get.rvm.io | bash -s stable
  • Перезагрузите свою оболочку
  • Установить Ruby с помощью rvm install 2.5.3
  • Переустановите ваши драгоценные камни (gem install httparty)

Затем вы можете перезапустить приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...