#ruby #url
#ruby #url
Вопрос:
Ruby Net:HTTP
необходимо предоставить полный URL-адрес, чтобы он мог подключиться к серверу и получить файл должным образом. Под «полным URL» я подразумеваю URL, включающий http://
часть и завершающую косую черту, если это необходимо. Например, Net:HTTP
не будет подключаться к URL, выглядящему следующим образом: example.com
, но будет нормально подключаться к http://example.com/
. Есть ли какой-либо способ убедиться, что URL-адрес является полным URL-адресом, и добавить необходимые части, если это не так?
РЕДАКТИРОВАТЬ: Вот код, который я использую:
parsed_url = URI.parse(url)
req = Net::HTTP::Get.new(parsed_url.path)
res = Net::HTTP.start(parsed_url.host, parsed_url.port) {|http|
http.request(req)
}
Комментарии:
1.
Uri.parse
здесь может помочь. ruby-doc.org/stdlib/libdoc/uri/rdoc2. @Brian: Странно, URL-адрес анализируется с помощью
URI.parse
, и все же я получаю ошибки, когда ему не указан правильный URL.3. Да, URI.parse выдаст вам
URI::Generic
объект вместоURI::HTTP
object, если вы исключите HTTP. УURI::Generic
класса нетrequest_uri
метода, поэтому Net:: HTTP блокирует его.
Ответ №1:
Если это делает только то, что показано в примере кода, Open-URI было бы более простым подходом.
require 'open-uri'
res = open(url).read
Комментарии:
1. Согласен. Как только я начал его использовать, я никогда не оглядывался назад.
2. Иногда требуется Net:: HTTP, потому что нам нужен лучший контроль, но в 99% случаев я использую open-uri.
Ответ №2:
Это позволило бы выполнить простую проверку на http / https:
if !(url =~ /^https?:/i)
url = "http://" url
end
Это может быть более общим для обработки нескольких протоколов (ftp и т.д.)
if !(url =~ /^w:/i)
url = "http://" url
end
Чтобы убедиться, что parsed_url.path
дает вам правильное значение (оно должно быть, /
когда не указан конкретный путь), вы могли бы сделать что-то вроде этого:
req = Net::HTTP::Get.new(parsed_url.path.empty? ? '/' : parsed_url.path)
Комментарии:
1. Это отлично работает. Хотя у меня все еще есть проблема с конечной косой чертой, если URL нуждается в этом.
2. @Mark: Я не думаю, что косая черта в конце обязательна (только что протестировано на Net :: HTTP в Ruby 1.9)
3. Всякий раз, когда я пытаюсь сделать это без косой черты, я получаю следующую ошибку: /Users/mark/.rvm/rubies / ruby-1.9.2-head/lib / ruby / 1.9.1/net/http.rb:1660:
initialize': HTTP request path is empty (ArgumentError) from /Users/mark/.rvm/rubies/ruby-1.9.2-head/lib/ruby/1.9.1/net/http.rb:1779:in
инициализировать’ из /Users/mark/Dropbox/prog/ruby/dl / lib / dl / dl.rb: 9:new' from /Users/mark/Dropbox/prog/ruby/dl/lib/dl/dl.rb:9:in
загрузить’ из ./dl: 40: в `<main>’4. Можете ли вы обновить свой вопрос точным кодом, который вы используете?
5. @Mark: Смотрите мой обновленный ответ. Обратите внимание, что когда вы просто используете
res = Net::HTTP.get(parsed_url)
, вам не нужно беспокоиться о косой черте в конце.