2012-03-14 12 views
10

Ho un elenco di URL, ho bisogno di verificare quali dei seguenti URL sono validi.Come ottenere solo il codice di risposta da una richiesta HTTP in Ruby

Il codice che ho usato è

require 'net/http' 

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

Qui posso controllare il codice di risposta 200 per un URL valido. La mia preoccupazione è che l'oggetto "res" restituito contenga codice, corpo, ecc. Quindi la mia risposta (oggetto res) diventa pesante. C'è un modo per poter ottenere solo il codice di risposta. Non ho bisogno di altre informazioni. Si prega di aiutare

risposta

8

Non ho verificato se è possibile fare con Net :: HTTP, ma è possibile utilizzare Curb, che è il wrapper di Ruby per curl. Curl::Easy#http_head

Con Net :: HTTP è inoltre possibile utilizzare HTTP#head, che richiede le intestazioni dal server utilizzando il metodo HEAD.

Informazioni su metodo HEAD di HTTP:

9,4 TESTA metodo

la testa è identica a GET tranne che il server non deve restituire un messaggio-corpo nella risposta. La metainformazione contenuta nelle intestazioni HTTP in risposta a una richiesta HEAD DOVREBBE essere identica alle informazioni inviate in risposta a una richiesta GET. Questo metodo può essere utilizzato per ottenere la metainformazione sull'entità implicita nella richiesta senza trasferire il corpo dell'entità stessa. Questo metodo viene spesso utilizzato per testare i collegamenti ipertestuali per la validità, l'accessibilità e le modifiche recenti.

Per ottenere il codice di risposta di una pagina:

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

A TESTA potrebbe essere la seguente:

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

Il codice che ho usato è:

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

Questo è più semplice in Faraday:

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

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