#ruby #httprequest #ruby-1.9.3 #net-http
#ruby #httprequest #ruby-1.9.3 #net-http
Вопрос:
Я использую Ruby 1.9.3 и мне нужно получить URL-адрес. Net::HTTP
Однако, если сайт не работает, Net::HTTP
он заканчивается зависанием.
Во время поиска в Интернете я видел, как многие люди сталкивались с подобными проблемами, и все с помощью хакерских решений. Однако многие из этих сообщений довольно старые.
Требования:
- Я бы предпочел использовать
Net::HTTP
для установки нового драгоценного камня. - Мне нужны как тело, так и код ответа. (например, 200)
- Я не хочу
require open-uri
, поскольку это вносит глобальные изменения и вызывает некоторые проблемы безопасности. - Мне нужно ПОЛУЧИТЬ URL-адрес в течение X секунд или вернуть ошибку.
Используя Ruby 1.9.3, как я могу ПОЛУЧИТЬ URL-адрес при установке тайм-аута?
Чтобы уточнить, мой существующий код выглядит так:
Net::HTTP.get_response(URI.parse(url))
Попытка добавить:
Net::HTTP.open_timeout(1000)
Приводит к:
NoMethodError: undefined method `open_timeout' for Net::HTTP:Class
Ответ №1:
Вы можете установить open_timeout
атрибут Net::HTTP
объекта перед установлением соединения.
uri = URI.parse(url)
Net::HTTP.new(uri.hostname, uri.port) do |http|
http.open_timeout = 1000
response = http.request_get(uri.request_uri)
end
Комментарии:
1.Макс — я не понимаю, как это сделать. Я использую метод класса
get_request
дляNet:HTTP
класса; ноopen_timeout
это метод включенHTTPSession
.open_timeout
Управляет ли глобальная настройка в каком-либо синглтоне?2.
Net::HTTP
имеет много запутанных методов класса, которые в основном являются ярлыками для созданияNet::HTTP
объектов (см. Исходный кодget_response
). Смотрите мою правку о том, как создатьNet::HTTP
объект самостоятельно.3. Как мне получить результат — тело и код результата http — используя этот код?
4. Пожалуйста, ознакомьтесь с документацией.
http.request_get
возвращает то же самое, что иNet::HTTP.get_response
5. Я попробовал, и
new
метод не работает с блоками для меня. Я изменилnew
метод наstart
метод, и все это работало нормально.
Ответ №2:
Я перепробовал все решения здесь и по другим вопросам об этой проблеме, но я понял все правильно только со следующим кодом, драгоценный камень open-uri является оболочкой для net::http. Мне нужен был get, который должен был ждать дольше, чем время ожидания по умолчанию, и прочитать ответ. Код также проще.
require 'open-uri'
open(url, :read_timeout => 5 * 60) do |response|
if response.read[/Return: Ok/i]
log "sending ok"
else
raise "error sending, no confirmation received"
end
end