В Ruby, используя "net/http", мы должны присоединиться к URL-адресу и запросить с помощью "?" сами?

В следующем коде мы должны сами присоединиться к url.path и url.query, используя символ ?? Есть ли более элегантный способ сделать это? Я должен использовать net/http, потому что в некоторых ситуациях я хочу также поместить строку в заголовок для агента-пользователя.

require 'net/http'

url_string = 'http://www.time.gov/timezone.cgi?Pacific/d/-8'

url = URI.parse(url_string)

response = Net::HTTP.start(url.host, url.port) do |http|
  http.get(url.path + '?' + url.query)
end
puts response.body[/<td.*(\d\d:\d\d:\d\d)/, 1]

Ответ 1

Используйте метод request_uri для объекта URI:

http://www.ruby-doc.org/stdlib/libdoc/uri/rdoc/classes/URI/HTTP.html#M009499

Обновленная версия вашего кода:

require 'net/http'

url_string = 'http://www.time.gov/timezone.cgi?Pacific/d/-8'

url = URI.parse(url_string)

response = Net::HTTP.start(url.host, url.port) do |http|
  http.get(url.request_uri)
end
puts response.body[/<td.*(\d\d:\d\d:\d\d)/, 1]

Ответ 2

Вы можете использовать URI#request_uri

Из документов:

Возвращает полный путь для HTTP запрос, как требуется Net:: HTTP:: Get.

Если URI содержит запрос, полный путь URI # path +? + URI #. В противном случае путь просто URI # путь.

Ответ 3

Net/http может стать хорошей основой, но это не очень удобно.

Если ваш клиент обращается к хорошо продуманному сервису, то что-то вроде ActiveResource, rest-client, или HTTParty будет лучшим выбором. Вы также можете написать независимый от приложения модуль, который цивилизовывает сеть /http таким образом, который хорошо работает для вас.