2010-06-24 7 views
0

J'ai essayé de modifier cette méthode en redirigeant et en renvoyant le contenu de l'URL vers une nouvelle URL valide à la place. Après avoir lu l'objet Net :: HTTP, je ne sais toujours pas exactement comment la méthode get_response fonctionne. Est-ce ce qui télécharge la page? Y a-t-il une autre méthode que je pourrais appeler qui ferait simplement un ping sur l'url au lieu de le télécharger?Ruby - Valider et mettre à jour l'URL

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') 

Répondre

1

Vous avez raison: get_response envoie une requête HTTP GET au serveur, qui demande la page entière.

Vous souhaitez utiliser une requête HEAD au lieu de GET. Cela demande le même en-tête de réponse HTTP qu'une requête GET obtiendrait, y compris le code d'état (200, 404, etc.), mais sans télécharger la page entière. Voir les méthodes request_head et head de Net::HTTP. Par exemple

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

Merci, cela fonctionne beaucoup plus vite. J'essaye juste de travailler avec la méthode originale. Comment le «cas» fonctionnerait-il dans cette situation? –

+0

C'est la même chose que votre code original. 'res' est un objet' Net :: HTTPResponse', tout comme le 'response' dans votre code. – user85509

+0

Je reçois un 'NoMethodError' quand j'essaye de mettre à jour l'objet. 'validate ': méthode non définie' host' pour # (NoMethodError) ' –

0

Voulez-vous dire, par 'ping l'url', vous voulez savoir si la requête d'url renvoie une réponse HTTP 200?

Je n'ai pas regardé l'implémentation de get_response, mais je pense qu'il envoie juste une requête HTTP GET, par son apparence.

Si vous voulez vérifier la réponse HTTP 200, je suppose que vous pourriez simplement continuer à faire get_response jusqu'à ce que vous obteniez HTTPSuccess & & HTTPOK.

Questions connexes