2010-11-13 3 views
1

J'ai une page Web qui a un formulaire qui est soumis via POST. Ce POST-route traite certaines données et redirige l'utilisateur vers une route GET. Le problème: La route GET est appelée plusieurs fois, généralement trois fois. Donc trois GET sont tirés et l'utilisateur voit la première requête GET. Les deux autres requêtes GET que je peux voir sur mes journaux.Post/Redirect/Get: Get est appelé plusieurs fois

Parfois, il arrive même que l'EEG est appelé plus de trois fois ...

(Bien sûr, la route POST est simplement appelé une fois ...)

Par la façon dont je me sers JRuby/JRack/Sinatra sur Jetty (-> Google App Engine.) Le problème se produit localement et à distance.

Philip

+0

J'ai vu que la réponse du serveur * après * la demande POST est un 302, c.f. http://www.gittr.com/index.php/archive/details-of-sinatras-redirect-helper/ J'ai changé le code en 303 mais le problème reste le même ... – Philip

+0

J'ai été capable de déboguer le problème beaucoup plus: Dans la réponse HTML GET, il y a un Javascript qui charge une image du serveur avec une URL relative. (/image/some_image.png) Si je supprime le code qui charge l'image, le problème ne se produit pas. En fait, en répondant à l'image-GET le serveur envoie quelques 304 choses (numéro de séquence correspondant à la demande) ... De toute façon je peux résoudre le problème en rendant l'URL absolue et en incluant un nom d'hôte ... – Philip

+0

POST via un client de ligne de commande comme cURL pour (a) vérifier que votre client n'envoie pas plusieurs requêtes GET, et (b) faire les requêtes POST et GET séparément pour vérifier qu'aucun des GET excédentaires n'est déclenché par la requête POST. Vous pouvez utiliser 'curl -vL' pour imprimer les requêtes émises et suivre les redirections, et ctrl-z &' fg' (si sous linux) pour faire une pause entre POST et GET pour vérifier les logs de votre serveur. –

Répondre

0

Je ne sais pas sans voir le code, mais dans la plupart des cas un script continuera à exécuter après un appel à une fonction de redirection. Essayez de revenir de votre méthode immédiatement après avoir appelé redirect_to.

+0

Sinatra est de très haut niveau, donc il quitte la fonction après avoir appelé la redirection. Comme on pourrait s'y attendre, le corps du message HTTP est vide. – Philip

+0

Je ne suis pas familier avec Sinatra - dans un contrôleur Rails, le retour de l'action mettrait fin au contrôleur. Il devrait y avoir un équivalent à un niveau d'abstraction plus élevé, quelque chose comme exit (0) pour terminer un script PHP. – Thilo

+0

Je viens de vérifier pour être sûr, mais une déclaration de retour après une redirection dans Sinatra ne fait aucune différence, car il n'est pas atteint. Mais il est similaire, une déclaration de retour dans Sinatra termine la réponse, après que l'instance peut être utilisée pour gérer la demande suivante. – Philip

-3

Il y a un bogue logique dans votre code. Répare le.

3

J'ai eu ce même problème dans mon code avant (bien que plate-forme différente). Il s'est avéré être des éléments dans la page référençant la même URL que la page. J'avais 1 image cassée et 2 fichiers css ignorés qui avaient été mis à la page parente.

Si c'est le même genre de problème, vous pouvez utiliser l'onglet net de Firebug pour vérifier et déboguer.

+0

Je suppose que c'est un peu différent, Firebug montre juste que les nuits sont normales ... – Philip

Questions connexes