2012-03-14 14 views
10

Tengo una lista de URL, necesito verificar cuáles de las siguientes URL son válidas.Cómo obtener solo el código de respuesta de una solicitud HTTP en Ruby

El código que utiliza es

require 'net/http' 

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

Aquí puede comprobar el código de respuesta 200 para una URL válida. Mi preocupación es que el objeto 'res' devuelto contiene código, cuerpo, etc. Entonces mi respuesta (objeto res) se vuelve pesada. ¿Hay alguna manera de que pueda obtener solo el código de respuesta? No necesito ninguna otra información. Por favor, ayuda

Respuesta

8

No he comprobado si es posible hacerlo con Net :: HTTP, pero puedes usar Curb, que es el Ruby wrapper para curl. Mire Curl::Easy#http_head

Con Net :: HTTP también puede usar HTTP#head, que solicita encabezados del servidor utilizando el método HEAD.

Información sobre CABEZA método de HTTP:

9,4 CABEZA método

la cabeza es idéntica a GET excepto que el servidor NO DEBE devolver un mensaje de cuerpo en la respuesta. La metainformación contenida en los encabezados HTTP en respuesta a una solicitud HEAD DEBERÍA ser idéntica a la información enviada en respuesta a una solicitud GET. Este método se puede usar para obtener metainformación sobre la entidad implicada por la solicitud sin transferir el cuerpo de la entidad en sí. Este método se usa a menudo para probar enlaces de hipertexto para determinar su validez, accesibilidad y modificaciones recientes.

Para obtener el código de respuesta de una página:

solicitud
require 'net/http' 
response = nil 
Net::HTTP.start('www.example.com', 80) {|http| 
    response = http.head('/page.html') 
} 
puts response.code 
2

Una cabeza podría tener este aspecto:

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 
5

El código que utiliza es:

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

Esto es más fácil en Faraday:

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

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