Comment "304 non modifié" est-il généré?
Comment un navigateur détermine-t-il si la réponse à une demande http est 304?
Est-ce défini par le navigateur ou envoyé par le serveur?
S'il est envoyé par le serveur, comment le serveur connaît-il les données disponibles dans le cache? Comment définit-il également une image sur 304?
À mon avis, s'il est généré par le navigateur
function is_modified()
{
return get_data_from_cache() === get_data_from_url();
};
function get_data_from_cache()
{
return some_hash_or_xxx_function(cache_data);
}
function get_data_from_url()
{
return some_hash_or_xxx_function(new_data);
}
function some_hash_or_xxx_function(data)
{
// do something with data
// what is that algorithm.?
return result;
}
console.log(is_modified());
Je compte sur un fournisseur d'API tiers pour obtenir des données, les analyser et les transmettre à la base de données. Les données peuvent ou ne peuvent pas changer à chaque requête, mais l'en-tête envoie toujours 200
, je ne veux pas analyser, vérifier le dernier ID unique dans la base de données, etc. pour déterminer le changement de données, ni comparer le résultat directement plutôt que I md5()
, sha1()
& crc32()
HASHed le résultat & fonctionne bien, mais je demande à l'algorithme de déterminer 304
.
Je veux utiliser le même type d'algorithme pour déterminer le changement de données.
Lorsque le navigateur place quelque chose dans son cache, il stocke également l'en-tête Last-Modified
ou ETag
du serveur.
Le navigateur envoie ensuite une requête avec l'en-tête If-Modified-Since
ou If-None-Match
, en demandant au serveur d'envoyer un message 304 si le contenu a toujours cette date ou cette heure ETag.
Le serveur a besoin d’un moyen de calculer une date modifiée ou un ETag pour chaque version de chaque ressource; Cela provient généralement du système de fichiers ou d'une colonne de base de données séparée.
Last-Modified: La dernière date de modification pour l'objet demandé
If-Modified-Since: permet de renvoyer un numéro 304 non modifié si la date de la dernière modification est inchangée.
ETag: un ETag est un identifiant opaque attribué par un serveur Web à une version spécifique d'une ressource trouvée sur une URL. Si la représentation de la ressource à cette URL change, un nouvel ETag différent est attribué.
If-None-Match: Permet de renvoyer un 304 non modifié si l'ETag n'est pas modifié.
le navigateur stocke le cache avec une date (Last-Modified) ou un id (ETag), lorsque vous devez redemander l'URL, le navigateur envoie un message de requête avec l'en-tête:
le serveur renvoie 304 lorsque l'instruction if est définie sur False et le navigateur utilise le cache.