2010-11-30 6 views
0

Ein bisschen eine seltsame Frage. Gibt es eine Möglichkeit, einen Webserver zu bitten, nur die Header und nicht den HTML-Code selbst zurückzugeben?Holen Sie URL-Header ohne HTML

Ich möchte einen Server nach einer URL fragen und sehen, ob es gültig ist (nicht 404/500/etc) und folgen Sie den Umleitungen (wenn vorhanden), aber nicht den tatsächlichen HTML-Inhalt.

Dank

  • Vorzugsweise ist ein Weg, dies

Antwort

1

Das ist genau das, was HEAD HTTP-Methode der Fall ist.

Für Ruby gibt es ein schönes Juwel, viel einfacher als die Low-Level-net/http, die Sie HEAD Anfragen ausführen können.

gem install rest-open-uri 

dann

 
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"] 

Es folgt Umleitungen. Sie müssen für SocketError retten, wenn der Host nicht existiert, oder OpenURI :: HTTPError, wenn die Datei nicht existiert.

Wenn Sie etwas stärkeres wollen, schauen Sie sich Mechanize oder HTTParty an.

0

Verwenden Rubys net/http und die in Ruby zu tun HEAD-Methode, die Mak erwähnte. Überprüfen Sie ri Net::HTTP#head von der Befehlszeile für Info.

2

Wie vorgeschlagen, überprüfen Sie die Net :: HTTP-Bibliothek ..

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

ich dies für eine Weile jetzt Ringe habe und dies ist die sauberste Antwort, die ich je gesehen habe – dabobert

0

eigentlich musste ich pantulis antwort in meine eigenen falten. es scheint, als ob es zwei Arten von Urls sind weder FNS allein gearbeitet, so dass ich

tat
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 
Verwandte Themen