Comment vérifier si jQuery.ajax() en-tête de demande est à l'État “304 not Modified”?
Comment vérifier si jQuery.ajax() en-tête de demande est à l'État "304 not Modified"?
jqXHR.status
renvoie généralement 200
, même lorsque demandé d'en-tête est "304 not Modified".
ifModified:true
n'aide pas beaucoup, car il se décompose XHR de demande de données.
- Réponse courte est non. Cependant, c'est un double possible de la Détermination de ce que jQuery .ajax() résout une chaîne de redirection Bien que pas exactement la même question, le concept est le même--XHR spec ne nécessite pas de notification de réponses 3xx.
- Il est intéressant de noter que vous n'avez pas besoin de faire de l'ETag vérifier manuellement à partir de votre javascript, le navigateur s'en chargera pour vous. Donc, sauf si vous avez une raison particulière de le faire, en général, vous n'avez pas besoin de vérifier pour la réponse 304
Vous devez vous connecter pour publier un commentaire.
Sans manipulation des en-têtes de cache manuellement, il n'est pas possible. Normalement, 304 réponses ne sont pas disponibles par le biais de la XHR API:
jQuery normalement ne sais pas il y avait une réponse 304, parce que le navigateur dit poli se trouve à JavaScript sur ce qui se passe réellement sur le réseau.
Mais il ya de bonnes nouvelles (genre de): vous peut obtenir de l'Ajax pour produire une réponse 304, mais seulement en réglant manuellement la Le cache HTTP
If-Modified-Since
ouIf-None-Match
dans la demande:Ainsi, vous pouvez utiliser le code:
Une difficulté fondamentale est comment savez-vous ce qu'date de dernière modification ou ETag envoyer? Le navigateur a le cache de l'information qu'il utilise pour l'envoi de demandes, mais il ne partageons pas cette information avec JavaScript. Heureusement, jQuery assure le suivi de la
Last-Modified
etETag
les en-têtes de réponses Ajax, de sorte que vous pouvez utiliserifModified:true
avoir jQuery définir ces valeurs d'en-tête la prochaine fois qu'il envoie une demande pour que des ressources.Deux choses à noter à ce sujet:
304 réponses ne sont pas transporter des données. C'est par la conception. L'hypothèse est que si vous avez choisi d'utiliser la mise en cache, vous devrait en avoir une copie des données qui sont déjà dans votre cache! Si aucune donnée n'sever est un problème (c'est à dire, parce que vous n'avez pas encore de données) pourquoi êtes-vous en utilisant la mise en cache? La mise en cache doit être utilisée lorsque vous avez les anciennes données sur la main et ne voulez de nouvelles données; ainsi, le retour pas de données avec un 304 ne devrait pas être un problème.
jQuery doit avoir une date de dernière modification ou un ETag (à utiliser avec
If-None-Match
) stockées à partir d'une précédente demande. Le processus va comme ceci:Première extraction: jQuery n'a pas de cache de l'information, afin de ne pas envoyer
If-Modified-Since
ouIf-None-Match
. Lorsque la réponse est de retour, le serveur peut annoncer de dernière modification des données ou d'en-tête ETag, jQuery qui stocke pour une utilisation future.Téléchargements suivants: jQuery a le cache de l'information à partir de la dernière opération d'extraction et transfère ces données vers le serveur. Si la ressource n'a pas changé, la requête Ajax obtient une réponse 304. Si la ressource a changé, la requête Ajax obtient une réponse 200, avec de nouvelles informations sur le cache pour jQuery à utiliser pour sa prochaine extraction.
jQuery ne pas persistent cache des informations (par exemple, dans les cookies) entre la page est rechargée, cependant. Par conséquent, la première extraction d'une ressource après un rechargement de la page sera jamais être un 304, parce que jQuery n'a pas de cache des informations à envoyer (c'est à dire, nous en remettre à la "extraire tout d'abord" l'affaire). Il n'ya aucune raison pourquoi jQuery ne pouvais pas persistent cache des informations, mais à présent, il n'a pas.
La ligne de fond ici est que vous pouvez utiliser des en-têtes de cache pour obtenir un JavaScript 304 réponse, mais vous ne pouvez pas accéder à la du navigateur lui-même ETag ou à la dernière date de modification pour une ressource particulière. Ainsi, le navigateur lui-même savez peut-être la mise en cache des informations sur une ressource, mais votre code JavaScript ne fonctionne pas. Dans ce cas, le navigateur va utiliser ses en-têtes de cache pour éventuellement obtenir une vraie réponse 304, mais avant une réponse de 200 à votre code JavaScript, parce que JavaScript ne pas envoyer les informations du cache.
Il n'est pas possible de faire du JavaScript 304 demandes sont en parfaite adéquation avec la réalité du réseau 304 réponses, parce que le cache de l'information de votre navigateur et le cache de l'information de votre code JavaScript peut varier de façon imprévisible. Cependant, obtenir 304 demandes correctement la plupart du temps, c'est assez bon pour la plupart des besoins de développement.
Exemple
Voici un bref exemple de serveur écrit en Node.js (mais il devrait être assez simple à port à d'autres langues):
Lors de l'exécution de ce serveur, vous pouvez charger la page dans votre navigateur et d'effectuer deux tests différents dans votre navigateur de la console:
Ce script va toujours voir un
200
réponse, même si le navigateur fournit unIf-Modified-Since
en-tête de demande et obtient un304
(ce qui se produira toutes les demandes après la première, après que le navigateur voit le serveurLast-Modifed
en-tête de réponse).En revanche, ce script toujours voir la réponse 304:
Le script fournit son propre
If-Modified-Since
en-tête de demande (deux jours après que le serveur de la date de dernière modification); il ne repose pas sur quel que soit le navigateur fournitures pourIf-Modified-Since
, et, par conséquent, est autorisé (par le XHR spec) pour voir les 304 réponses.Enfin, ce script va toujours voir un
200
:C'est parce que le script utilise un
If-Modified-Since
qui est avant le serveur de la date de dernière modification, afin que le serveur envoie toujours un200
. Le serveur ne sera pas envoyer un304
parce qu'il suppose que le client ne dispose pas d'une copie en cache de la version la plus récente (c'est à dire, le client annonce qu'il est connu des changements depuis Février 12, mais il y avait un changement le 13 Février que le client n'a apparemment pas vu).If-Modified-Since
+Last-Modified
méthode native XMLHttpRequest 2 et, malheureusement, Chrome renvoie toujours à 200 et Firefox 301 résultats du cache. Regarde comme il n'y a pas valable XMLHttpRequest cache validation possible à tous.If-Modified-Since
valeurs? Le script ne peut que constater 304 réponses lorsque le serveur envoie 304 réponses. À l'aide d'un expliciteIf-Modified-Since
permet existant 304 réponse à être visible pour le script (et non cachés 200); il ne génère pas un statut 304 où l'on n'existe pas déjà dans la réponse réelle.Également les en-têtes seront mis en cache si la réponse vient de cache. J'ai pris cela comme une chance.
Mon serveur envoie un unique md5-tête. Cela n'a pas le même effet ?query=time(). Maintenant sur JS côté vérifier la dernière md5-tête avec le courant. Si vous recevez le même MD5-tête avant que la réponse est à venir à partir du cache. J'ai tout oublié à propos de JQuery, mais vu qu'il est possible de définir et de lire les en-têtes.
C'est un peu un abus, car md5 devrait être une valeur de hachage pour vérifier que les "données décodées sont les mêmes données qui ont été envoyées".
J'ai sorte de mise en
https://github.com/laukstein/ajax-seo/blob/cbed03222d89f6f7e75dc49ce8882c30201bbb86/index.php#L266-274
Peut-être essayer cela?
readsystatechange
n'est pas déclenché par 3xx réponses,complete
ne sera pas entré toutstatus
est 304.ouvrez vos navigateurs inspecteur et il va vous montrer les infos sur la requête ajax, y compris de l'état.
pour chrome, cliquez droit et choisissez inspecter l'élément, puis allez à l'onglet Réseau.
pour firefox, il suffit d'utiliser firebug et suivez les mêmes étapes.