2010-06-24 296 views
0

我一直在嘗試修改這個方法,從重定向和返回的URL的內容,而不是返回新的有效的URL。紅寶石 - 驗證和更新網址

讀到Net :: HTTP對象後,我仍然不確定get_response方法的工作原理。這是什麼下載頁面?有沒有另一種方法可以調用,而不是下載它呢?

require 'net/http' 

def validate(url) 
    uri = URI.parse(url) 
    response = Net::HTTP.get_response(uri) 

    case response 
    when Net::HTTPSuccess 
     return response 
    when Net::HTTPRedirection 
     return validate(response['location']) 
    else 
     return nill 
    end 
end 


puts validate('http://somesite.com/somedir/mypage.html') 

回答

1

get_response向請求整個頁面的服務器發送HTTP GET請求是正確的。

您想要使用HEAD請求而不是GET。這會請求與GET請求相同的HTTP響應頭,包括狀態碼(200,404等),但不會下載整個頁面。

參見Net::HTTPrequest_headhead方法。例如

url = URI.parse('http://www.ruby-doc.org/stdlib/libdoc/net/http/rdoc/index.html') 
res = Net::HTTP.start(url.host, url.port) {|http| 
    http.head(url.path) 
} 
puts res.class 
+0

謝謝,這是工作得更快。只是試圖將其用於原始方法。 'case'在這種情況下會如何工作? – 2010-06-24 07:20:05

+0

這與您的原始代碼相同。 'res'是一個'Net :: HTTPResponse'對象,就像代碼中的'response'一樣。 – user85509 2010-06-24 07:31:13

+0

雖然當我嘗試更新對象時,我得到一個'NoMethodError'。 '驗證':未定義的方法'主機'爲#<字符串:0x100311360>(NoMethodError)' – 2010-06-24 07:48:13

0

你的意思是,'ping the url',你想知道url請求是否返回HTTP 200響應?

我沒有看過get_response的實現,但我認爲它只是通過它的外觀發送一個HTTP GET請求。

如果你想檢查HTTP 200響應,我想你可以繼續做get_response,直到你得到HTTPSuccess & & HTTPOK。