2010-11-30 19 views
0

Un peu une question étrange. Existe-t-il un moyen de demander à un serveur Web de renvoyer uniquement les en-têtes et non le code HTML lui-même?Obtenir les en-têtes d'URL sans HTML

Je veux demander à un serveur une URL et voir si elle est valide (pas 404/500/etc) et suivre les redirections (si présentes) mais pas obtenir le contenu HTML réel.

Merci

  • De préférence une façon de le faire en Ruby

Répondre

1

C'est exactement ce méthode HTTP HEAD fait.

Pour Ruby, il y a une belle gemme, beaucoup plus simple que le bas niveau/http qui vous permet d'effectuer HEAD demandes.

gem install rest-open-uri 

puis

 
irb> require 'rubygems' 
=> true 
irb> require 'rest-open-uri' 
=> true 
irb> sio = open("http://stackoverflow.com", :method => :head) 
=> # 
irb> sio.meta 
=> {"expires"=>"Tue, 30 Nov 2010 18:08:47 GMT", "last-modified"=>"Tue, 30 Nov 2010 18:07:47 GMT", "content-type"=>"text/html; charset=utf-8", "date"=>"Tue, 30 Nov 2010 18:08:27 GMT", "content-length"=>"193779", "cache-control"=>"public, max-age=18", "vary"=>"*"} 
irb> sio.status 
=> ["200", "OK"] 

Il suit redirections. Vous devez sauver pour SocketError quand l'hôte n'existe pas ou OpenURI :: HTTPError si le fichier n'existe pas. Si vous voulez quelque chose de plus puissant, jetez un oeil à Mechanize ou HTTParty.

0

Utilisez le filet de Ruby/http et HEAD méthode que Mak mentionné. Vérifiez ri Net::HTTP#head à partir de la ligne de commande pour plus d'informations.

2

Comme suggéré, vérifiez la bibliothèque Net :: HTTP ..

require 'net/http' 
Net::HTTP.new('www.twitter.com').request_head('/').class 
+0

J'ai lutté cela depuis un certain temps maintenant et c'est la réponse la plus propre que j'ai jamais vu – dabobert

0

En fait, j'ai dû replier la réponse de Pantulis dans la mienne. il semble qu'il y ait deux types d'URL, ni fns travaillé seul, donc je l'ai fait

module URI 

    def self.online?(uri) 
    URI.exists?(uri) 
    end 

    def self.exists?(uri) 
    URI.exists_ver1?(uri) 
    end 

    def self.exists_ver1?(url) 
    @url = url 
    ["http://", "https://"].each do |prefix| 
     url = url.gsub(prefix, "") 
    end 

    begin 
     code = Net::HTTP.new(url).request_head('/').code 
     [2,3].include?(code.to_i/100) 
    rescue 
     URI.exists_ver2?(@url) 
    end 
    end 


    def self.exists_ver2?(url) 
    url = "http://#{url}" if URI.parse(url).scheme.nil? 
    return false unless URI.is_a?(url) 
    uri = URI(url) 
    begin 
     request = Net::HTTP.new uri.host 
     response= request.request_head uri.path 
     #http status code 200s and 300s are ok, everything else is an error 
     [2,3].include? response.code.to_i/100 
    rescue 
     false 
    end 
    end 
end