2010-06-24 395 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。