Создание URL-адреса в строке, пригодной для использования в Ruby’s Net:: HTTP

#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/rdoc

2. @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) , вам не нужно беспокоиться о косой черте в конце.