Как получить только код ответа из HTTP-запроса в Ruby

У меня есть список 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 object) становится тяжелым. Есть ли способ, чтобы я мог получить только код ответа. Мне не нужна никакая другая информация. Пожалуйста, помогите

Ответ 1

Я не проверял, возможно ли это делать с Net:: HTTP, но вы можете использовать Curb, который является оболочкой Ruby для завитки. Посмотрите 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

Ответ 2

Это проще всего в Faraday:

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

# example with headers
resource_size = response.headers['Content-Length']

Ответ 3

Используемый мной код:

response = nil
Net::HTTP.start('upload.wikimedia.org', 80) {|http|
 response = http.head(url)
}
puts response.code

Ответ 4

Запрос 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