Problèmes avec le résultat mis en cache lors de l'envoi d'un XMLHttpRequest?

Je suis nouveau sur l'idée d'AJAX ainsi que sur la mise en cache.

Sur l' AJAX – Envoyer une demande à un serveur de W3Schools, il est recommandé d'ajouter "?t=" + Math.random() à la fin de l'URL du script à exécuter pour empêcher la mise en cache.

Sur Wikipédia, la définition simple de "cache" est:

En informatique, un cache est un composant qui stocke de manière transparente les données afin que les demandes futures pour ces données puissent être plus rapidement fournies. Les données qui sont stockées dans un cache peuvent être des valeurs qui ont été calculées plus tôt ou des doublons de valeurs d'origine stockées ailleurs.

Mais, ne devrait-il pas être mieux? Le script fonctionnera plus rapidement si l'ordinateur dispose déjà de données en double. En outre, le premier exemple de la page du didacticiel, sans addition à l'URL, a fonctionné correctement.

Quelqu'un peut-il me dire la raison derrière l'utilisation de "?t=" + Math.random() ?

Mais, ne devrait-il pas être mieux?

Oui, il est préférable d'avoir un système de cache pour la raison de la performance, vos pages d'application seront chargées rapidement car les éléments chargés une fois seront récupérés sans faire à chaque fois une requête HTTP au serveur.

Quelqu'un peut-il me dire la raison derrière l'utilisation de "? T =" + Math.random ()?

En ajoutant ce "?t=" + Math.random() est comme renommer l'URL du script chaque fois que vous le rechargez. Le système de mise en cache le verra comme un nouvel élément et non comme un ancien qu'il ait déjà stocké même si rien n'a été vraiment modifié. Il oblige donc à recharger l'élément du serveur.

Généralement, nous pouvons vouloir faire cela sur des éléments (comme des images, des scripts) qui sont souvent mis à jour. Par exemple, c'est le cas pour une image de profil dans un site Web qu'un utilisateur peut changer, si l'ancien fichier d'image est dans le cache, l'utilisateur ne verra pas la nouvelle image apparaître immédiatement si nous n'utilisons pas cette astuce du nombre aléatoire . L'utilisateur pourrait penser que son téléchargement ne fonctionnait pas. Il aurait dû vider le cache manuellement dans son navigateur, ce qui n'est pas toujours très intuitif.

Une deuxième raison pourrait être que c'est bon de le faire pendant que nous développons parce que nous n'avons pas besoin de vider le cache chaque minute que nos changements de code sont pris en compte …

Cependant, ne pas utiliser cette astuce sur des éléments que vous êtes sûrs ne changera pas ou très rarement.

La raison de l'ajout d'un élément aléatoire à la fin d'une demande de service Web est que, dans de nombreux cas, vous souhaitez que les données soient toujours fraîches. Si vous le cachez, il est possible que les données ne soient pas nouvelles.

Par exemple, disons que vous avez une demande AJAX qui vous donne le meilleur score actuel d'un jeu. Vous l'appelez avec http://example.com/get_high_score.php . Dit qu'il revient 100 . Maintenant, dites que vous attendez 5 secondes et appelez-le à nouveau (ou l'utilisateur actualise sa page). Si cette demande a été mise en cache, elle peut renvoyer 100 nouveau. Cependant, à ce moment-là, le score peut être maintenant de 125 .

Si vous appelez http://example.com/get_high_score.php?t=12345786 , le score serait la dernière valeur, car il n'a pas été mis en cache.

url + "?t=" + Math.random() n'est qu'un moyen de faire cela. Je préfère plutôt utiliser une horodatage à la place, car cela garantit toujours être unique.

url + "?t=" + (new Date()).getTime()

Sur le revers, si vous n'avez pas besoin que les données soient toujours fraîches (par exemple, vous envoyez simplement une liste d'options d'éléments de menu qui ne changent presque jamais), puis la mise en cache est correcte et vous souhaitez laisser hors tension bit.

Une alternative est d'utiliser un horodatage, ou de créer un modèle qui change toutes les quelques secondes. Bien que la meilleure méthode (si vous le pouvez) consiste à ajouter des entrées dans l'en-tête de la réponse de votre serveur pour indiquer au navigateur de ne pas mettre en cache le résultat.

var t = new Date().getTime(); var t2 = Math.floor(t/10000); url = target_url + "?t=" + t2;

Bien qu'il soit peu probable dans ce cas, sachez si votre site génère continuellement des liens vers des URL internes aléatoires, par exemple à travers le code côté serveur, puis il devient un «piège à araignée» et des robots tels que les moteurs de recherche sont bloqués dans une boucle suivant ces liens aléatoires Causant des pics dans votre chargement du serveur.