Как получить только код ответа из HTTP-запроса в Ruby - PullRequest
10 голосов
/ 14 марта 2012

У меня есть список URL-адресов, мне нужно проверить, какой из следующих URL-адресов действителен.

Я использовал код

require 'net/http'

url = 'http://mysite.com'
res = Net::HTTP.get_response(URI.parse(url.to_s))
puts res.code

Здесь я могу проверить код ответа 200для действительного URL.Меня беспокоит то, что возвращаемый объект res содержит код, тело и т. Д. Таким образом, мой ответ (объект res) становится тяжелым.Есть ли способ, чтобы я мог получить только код ответа.Мне не нужна никакая другая информация.Пожалуйста, помогите

Ответы [ 4 ]

9 голосов
/ 14 марта 2012

Я не проверял, возможно ли это сделать с Net :: HTTP, но вы можете использовать Curb, который является оболочкой Ruby для curl.Посмотрите на Curl::Easy#http_head

С Net :: HTTP вы также можете использовать HTTP#head, который запрашивает заголовки с сервера, используя метод HEAD.

Информация о методе HTTP HEAD:

9.4 HEAD

Метод HEAD идентичен GET, за исключением того, что сервер НЕ ДОЛЖЕН возвращать тело сообщения в ответе.Метаинформация, содержащаяся в заголовках HTTP в ответ на запрос HEAD, ДОЛЖНА быть идентична информации, отправленной в ответ на запрос GET.Этот метод может использоваться для получения метаинформации о сущности, подразумеваемой запросом, без передачи самого тела сущности.Этот метод часто используется для проверки гипертекстовых ссылок на достоверность, доступность и последние изменения.

Чтобы получить код ответа страницы:

require 'net/http'
response = nil
Net::HTTP.start('www.example.com', 80) {|http|
  response = http.head('/page.html')
}
puts response.code
6 голосов
/ 28 ноября 2012

Это проще всего в Фарадей :

# one line to make request
response = Faraday.head url

# example with headers
resource_size = response.headers['Content-Length']
5 голосов
/ 14 марта 2012

Код, который я использовал:

response = nil
Net::HTTP.start('upload.wikimedia.org', 80) {|http|
 response = http.head(url)
}
puts response.code
2 голосов
/ 14 марта 2012

Запрос HEAD может выглядеть так:

require 'socket'

s = TCPSocket.open("google.com", 80)
s.puts "HEAD / HTTP/1.1"
s.puts "Host: google.com"
s.puts

headline = s.gets
s.close

status = headline.scan(/\d\d\d/).first.to_i
...