web-dev-qa-db-fra.com

Comment fonctionne "304 non modifié"?

  • 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.

161
VenomVendor

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.

188
SLaks

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:

enter image description here

le serveur renvoie 304 lorsque l'instruction if est définie sur False et le navigateur utilise le cache.

16
宏杰李