В Ruby, используя «net / http», мы должны объединить URL и выполнить запрос, используя «?» сами? - PullRequest
12 голосов
/ 28 февраля 2011

В следующем коде мы должны сами присоединиться к 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]

Ответы [ 3 ]

18 голосов
/ 28 февраля 2011

Используйте метод 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]
8 голосов
/ 28 февраля 2011

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

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

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

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

3 голосов
/ 28 февраля 2011

Сеть / http может стать хорошей основой, но она не очень удобна для пользователя.

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

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