Как получить только код ответа из 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