2010-10-08 4 views
0

J'ai une page Web qui redirige vers une autre URL sous la forme de http://www.example.com/url.html#midpage.Comment obtenir WWW :: Mechanize pour gérer correctement les redirections 302 avec des fragments d'URI?

Je me demande s'il y a de toute façon WWW::Mechanize à suivre http://www.example.com/url.html au lieu de http://www.example.com/url.html#midpage? Sous-classes LWP::UserAgent, vous pouvez toujours utiliser l'une des méthodes LWP::UserAgent

+0

Qu'avez-vous essayé jusqu'à présent? Où est votre court script de démonstration qui montre le problème? Avez-vous lu la documentation? –

+0

Je pense que vous voulez dire 302 redirections. – CanSpice

Répondre

1

Ainsi, vous pouvez utiliser la méthode , qui ne gère pas automatiquement les redirections. Il vous renvoie simplement la réponse en tant qu'objet HTTP::Resonse. Ce qui signifie que vous pouvez utiliser les méthodes is_redirect() et header() pour obtenir l'URI de redirection. Ce qui signifie que vous pouvez ensuite utiliser le module URI pour tout retirer après le #.

Ouf!

Votre code ressemblerait à quelque chose comme ceci:

my $response = $mech->simple_request(HTTP::Request->new(GET => 'http://www.example.com/')); 
if($response->is_redirect) { 
    my $location = $response->header("Location"); 
    my $uri = new URI($location); 
    my $new_url = $uri->scheme . $uri->opaque; 
# And here is where you do the load of the new URL. 
} 

Il peut y avoir tripotant à faire, potentiellement autour de la ligne header(), mais ce serait l'idée générale.

+0

Je pense que j'ai peut-être juste désactivé la partie fragment, mais c'est fondamentalement la même approche. Vous feriez la même chose dans un gestionnaire reponse_done. –

1

WWW::Mechanize est une sous-classe de LWP::UserAgent, donc la réponse est la même. Si vous souhaitez gérer vous-même la redirection pour réécrire les URL, vous pouvez utiliser un gestionnaire response_done ou response_redirect. Voir la section "Handlers" des documents LWP :: UserAgent. Comme pour "correctement", le HTTP specification ne dit pas ce qu'un client doit faire avec un fragment sauf dans 14.6 dans le cas d'un en-tête de referrer (et c'est le seul endroit où le mot "fragment" apparaît même).

Questions connexes