Requête sur un fichier déjà en cache avec Opera via XMLHttpRequest

Requête sur un fichier déjà en cache avec Opera via XMLHttpRequest - HTML/CSS - Programmation

Marsh Posté le 26-05-2007 à 02:03:32    

Bonjour, :hello:  
 
J'utilise dans un javascript l'objet XMLHttpRequest pour lancer des requêtes vers des documents xml et normalement je rencontre pas de problème. Sauf que là, avec Opera en lançant des requêtes sur des fichiers de plus de 98112 octets (oui c'est précis :d ) ça marche... mais qu'une seule fois! Dès qu'une nouvelle requête est lancée sur la même URL, le navigateur utilise le cache et foire l'opération (il ne se passe plus rien, il faut vider le cache pour pouvoir reloader le fichier).
 
La seule solution serait de générer une variable aléatoire dans l'url mais ça forcerait le reload du fichier à chaque fois...
 
Voici l'exemple simplifié au maximum, normalement sous Opera le lien affiche une boîte de dialogue qu'une seule fois :
 
98113octets.xml

Code :
  1. fichier contenant <xml>000000000000...</xml> de 98113 octets


test.htm

Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/dtD/xhtml1-strict.dtd">
  2. <html xml:lang="fr" lang="fr" xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4.   <title></title>
  5.   <script type="text/javascript">
  6. function LoadXML(Url, CallBack) {
  7. var XMlDoc = new XMLHttpRequest();
  8. XMlDoc.overrideMimeType('text/xml');
  9. XMlDoc.open('GET', Url, false);
  10. XMlDoc.send(null);
  11. alert("ok" );
  12. }
  13.   </script>
  14. </head>
  15. <body>
  16.   <div>
  17.    <a href="javascript:LoadXML('98113octets.xml')">Go!</a>
  18.   </div>
  19. </body>
  20. </html>


Exemple

Reply

Marsh Posté le 26-05-2007 à 02:03:32   

Reply

Marsh Posté le 26-05-2007 à 06:28:12    

fils_de_la_lumiere a écrit :

Bonjour, :hello:  
 
J'utilise dans un javascript l'objet XMLHttpRequest pour lancer des requêtes vers des documents xml et normalement je rencontre pas de problème. Sauf que là, avec Opera en lançant des requêtes sur des fichiers de plus de 98112 octets (oui c'est précis :d ) ça marche... mais qu'une seule fois! Dès qu'une nouvelle requête est lancée sur la même URL, le navigateur utilise le cache et foire l'opération (il ne se passe plus rien, il faut vider le cache pour pouvoir reloader le fichier).
 
La seule solution serait de générer une variable aléatoire dans l'url mais ça forcerait le reload du fichier à chaque fois...
 
Voici l'exemple simplifié au maximum, normalement sous Opera le lien affiche une boîte de dialogue qu'une seule fois :
 
98113octets.xml

Code :
  1. fichier contenant <xml>000000000000...</xml> de 98113 octets


test.htm

Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/dtD/xhtml1-strict.dtd">
  2. <html xml:lang="fr" lang="fr" xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4.   <title></title>
  5.   <script type="text/javascript">
  6. function LoadXML(Url, CallBack) {
  7. var XMlDoc = new XMLHttpRequest();
  8. XMlDoc.overrideMimeType('text/xml');
  9. XMlDoc.open('GET', Url, false);
  10. XMlDoc.send(null);
  11. alert("ok" );
  12. }
  13.   </script>
  14. </head>
  15. <body>
  16.   <div>
  17.    <a href="javascript:LoadXML('98113octets.xml')">Go!</a>
  18.   </div>
  19. </body>
  20. </html>


Exemple


 
 
Mais justement c'est le but, tu veux recharger ton XML, ben tu force le rechargement via un "?nocache="+Math.random() ajouté à l'url du XML.  
Je vois pas ton PB
si tu veux reloader ton fichier force l'operation.
ET accessoirement; si c'est pour mettre des merdes dans le XML on passe par du CDATA et le XML c'est en UTF-8 en général avec un petit prologue avant le doctype.

Reply

Marsh Posté le 26-05-2007 à 13:53:19    

Heu non le xml de l'exemple est complètement bidon, tout ce qui compte c'est que sa taille totale soit de 98113 octets.
 
Apparemment tu ne m'a pas très bien compris je recommence en essayant d'être plus clair :
 
Avec Opera (dernière version), lorsque je lance une requête sur un fichier dépassant 98112 octets via XMLHttpRequest, la première fois : il télécharge le fichier (sans se servir de son cache donc) et réussi l'opération.
 
Les fois suivantes, il utilise son cache plutôt que de re-télécharger le fichier (logique, d'ailleurs c'est ce que je veux).  
 
Mais petit bémol : il foire complètement et ne récupère pas le fichier dans son cache. Essaie avec ce test, tu vides ton cache, tu cliques sur "go", au bout de quelques secondes le fichier est téléchargé et "ok" s'affiche mais les fois suivantes l'opération (qui devrait être immédiate avec le cache d'ailleurs) ne se fait plus...

Reply

Marsh Posté le 26-05-2007 à 16:45:56    

fils_de_la_lumiere a écrit :


Les fois suivantes, il utilise son cache plutôt que de re-télécharger le fichier (logique, d'ailleurs c'est ce que je veux).


 
Dans ce cas tu stockes le XML dans un cookie pour les fois suivantes et on en parle plus.
Mais je trouve un peu stupide que tu veuilles forcer le navigateur à recharger le XML depuis son cache au lieu de ton site.
C'est pas normal.
 

fils_de_la_lumiere a écrit :


Mais petit bémol : il foire complètement et ne récupère pas le fichier dans son cache. Essaie avec ce test, tu vides ton cache, tu cliques sur "go", au bout de quelques secondes le fichier est téléchargé et "ok" s'affiche mais les fois suivantes l'opération (qui devrait être immédiate avec le cache d'ailleurs) ne se fait plus...


Bizarre ton pb, je n'ai pas le temps de tester. Mais j'ai jouer azvec des XML de 400 Ko et sous Opera je n'ai pas eu de problème ceci dit je forcais le XML à être retéléchargé

Reply

Marsh Posté le 26-05-2007 à 18:42:58    

J'ai jamais forcé Opera à recharger le fichier depuis le cache :d , je fais juste une requête vers une ressource via XMLHttpRequest après il fait ce qu'il veut (le plus logique serait quand même qu'il le mette en cache mais bon) tant que ça marche.
 
La seule chose que je veux c'est de pouvoir faire cette requête via XMLHttpRequest vers cette ressource plusieurs fois dans l'avenir (dans 1 minute ou 1 semaine) mais le fait est que si la ressource a été mise en cache une fois, ça ne marche plus par la suite à moins de vider le cache.
 
La solution du cookie est la pire des solutions :D  (d'autant plus qu'un cookie est limité en taille), logiquement ça devrait marcher avec ce p'tit bout de code ultra simple y'a pas de raison.


Message édité par fils_de_la_lumiere le 26-05-2007 à 18:45:24
Reply

Marsh Posté le 26-05-2007 à 21:31:55    

ben tu forces le téléchargement et on en parle plus. De toute manière c'est comme cela que devraient etre traitées toutes les requetes HTTP

Reply

Marsh Posté le 26-05-2007 à 21:48:50    

Je post justement pour trouver une alternative au forçage du redl car c'est pas normal.
 
Le xml en question est en fait un fichier .XSL statique de 98 ko qui est sensé mettre en style un fichier XML dynamique de ~20ko (je passe par la transformation xslt et je peux pas faire autrement), c'est impensable de re-télécharger à chaque fois le XSL de 98ko d'autant plus que je n'ai ce problème qu'avec Opera.
 
De plus j'aimerai comprendre pourquoi ça marche pas avec cet exemple simplifié au maximum plutôt que de me résigner.

Reply

Marsh Posté le 27-05-2007 à 02:14:28    

Je kif, une XSL qui pèse 5x plus lourd que le XML :/
Ya un bug dans ta matrice hein :o

Reply

Marsh Posté le 27-05-2007 à 22:58:32    

aucune importance, ça aurait pu être un .avi le problème n'est pas là, je cherche juste à faire fonctionner ce minuscule petit bout de code tout simple :o

Reply

Marsh Posté le 29-05-2007 à 21:55:36    

up

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed