Utiliser HTTP Validation

La meilleure approche consiste à utiliser le modèle de validation HTTP. Ce modèle envoie chaque réponse avec un billet qui fait référence à l'unicité des données. Si le client veut en télécharger le contenu, le client envoie au serveur un billet au dernier téléchargement. Le serveur compare le ticket envoyé avec le billet qu'il a, et si les avis de serveur, les tickets sont identiques, il envoie une requête HTTP 304 à indiquer qu'aucun changement n'a eu lieu. A ce stade, le client peut récupérer l'ancien contenu du cache et de le présenter à l'utilisateur comme le dernier et le plus grand. Le modèle de validation HTTP nécessite encore une requête HTTP, mais il ne comprend pas le coût de générer et d'envoyer le contenu à nouveau. En termes d'une conversation par HTTP, le modèle de validation HTTP est implémenté comme suit. Cet exemple illustre une demande d'un client et la réponse du serveur.

 Demande 1GET / HTTP/1.1 Accept ajax/chap04/cachedpage.html: * / * Accept-Language: fr-ca Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; . NET CLR 2.0.50215) Host: 127.0.0.1:8081 Connection: Keep-Alive Réponse 1HTTP/1.1 200 OK ETag: W / "45-1123668584000" Last-Modified: Wed, 10 Aug 2005 10:09:44 GMT Content-Type: text / html Content-Length: 45 Date: Wed, 10 Aug 2005 10: 11:54 GMT Server: Apache-Coyote/1.1  Le contenu en cache 
  

Le client fait une demande pour le document / ajax/chap04/cachedpage.html. Le serveur répond avec le contenu, mais il n'ya pas Cache-Control ou expire identifiant. Cela semble indiquer que la teneur en retour ne soit pas mis en cache, mais ce n'est pas vrai. Le serveur a indiqué qu'elle est d'utiliser le modèle de validation HTTP, et non le modèle d'expiration HTTP. La page qui est retournée est devenue partie intégrante d'une cache identifié par l'identifiant ETag unique. L'identifiant ETag, appelé entité tag, Pourrait être comparé à un code de hachage unique pour une page HTML. La lettre M qui est en tête de l'identificateur de balise entité signifie que la page est une référence faible et le serveur HTTP mai reflètent pas immédiatement mises à jour de la page sur le côté serveur. L'étape suivante consiste à actualiser le navigateur et demander la même page à nouveau. La conversation HTTP est le suivant.

 Requête 2GET / HTTP/1.1 Accept ajax/chap04/cachedpage.html: * / * Accept-Language: fr-ca Accept-Encoding: gzip, deflate If-Modified-Since: Thu, 10 Aug 2005 10:09:44 GMT If - None-Match: W / "45-1123668584000" User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;. NET CLR 2.0.50215) Host: 192.168.1.100:8081 Connection: Keep-Alive Réponse 2HTTP/1.1 304 Not Date de modification: Wed, 10 Aug 2005 10:11:58 GMT Server: Apache-Coyote/1.1

Lorsque le client effectue une deuxième demande, les identificateurs supplémentaires If-Modified-Since et If-None-Match sont envoyés dans la requête. Remarquez comment le If-None-Match références identifiant l'identifiant de la valeur précédemment envoyé ETag. Le serveur interroge l'URL et génère la balise entité. Si la balise entité est identique à la valeur de son envoi, le serveur retourne un code HTTP 304 pour indiquer que le contenu n'a pas changé. Lors de l'utilisation des balises entité, le client peut envoyer un If-Match ou un If-None-Match. Si le client envoie un si-Match, et les données sur le serveur n'est pas à jour, le serveur renvoie un cache miss erreur, et non les nouvelles données. Si le client envoie une If-None-Match identifiant lorsque les données du serveur est inchangée, le serveur envoie un code retour HTTP 304. Si les données sont à jour, de nouvelles données sont envoyées.

L'avantage d'utiliser le modèle de validation de mise en cache HTTP, c'est que vous êtes toujours assuré d'obtenir la dernière version au moment de la demande. Les clients peuvent en faire la demande toutes les deux secondes, des heures, des semaines ou quelque période de leur choix. Il appartient au client de décider quand prendre une nouvelle copie de ces données. Accordée, il ya encore du trafic HTTP en raison des demandes, mais il a été réduit à Un minimum. Tout cela étant dit, il existe des situations où l'aide du modèle d'expiration HTTP ne font sens par exemple, lorsque le contenu HTML est statique et change rarement . Le modèle d'expiration HTTP pourraient être utilisées dans le modèle de requête unique pour élaguer les entrées du contrôleur de cache quand ils deviennent périmés.

Implémentation d'un client HTTP cache à l'aide de validation Le cache de requête unique client peut être étendu pour utiliser HTTP validation. Quels sont les changements dans le modèle de validation HTTP est que la demande physique sera toujours faite. Du point de vue de la navigation de métadonnées, ce qui pourrait causer un léger retard dû à la nécessité de faire une demande pour vérifier que les données sont en cours. Cependant, le cycle de la réponse demande est assez simple, comme résultat la plupart des cas dans un "pas changé» réponse. La mise en oeuvre complète des deux fonctions requises pour asynchrone est le suivant.

 Source: / client / scripts / jaxson / var Common.js HttpValidationCacheController = (_cache: new Array (), didNotFindETagError: function (url) ()) function HTTPValProcessAndBreakBeforeRequest (XMLHTTP, demande, réglages) (if (request.action == "GET" ) (var obj = HttpValidationCacheController._cache [url]; if (obj! = null) ( this.xmlhttp.setRequestHeader ( "If-None-Match", obj.ETag); (this.xmlhttp.setRequestHeader "Pragma", "no-cache"); (this.xmlhttp.setRequestHeader "Cache-Control", "no-cache");)) Return false;) function HTTPValProcessAndBreakAfterRequest (XMLHTTP, demande, réglages) (if (xmlhttp.status == 200 & & request.action == "GET") (if (xmlhttp.status == 200) (try (var = foundetag xmlhttp.getResponseHeader ( "ETag"); if (foundetag! = null) (HttpValidationCacheController._cache [url] = ( ETag: foundetag,Situation: xmlhttp.status, StatusText: xmlhttp.statusText, responseText: xmlhttp.responseText, responseXML: xmlhttp.responseXML);) else (HttpValidationCacheController.didNotFindETagError (url);)) catch (Exception) (HttpValidationCacheController.didNotFindETagError (url);) ) else if (status == 304) (var obj = HttpValidationCacheController._cache [url]; if (obj! = null) (var fakeXMLHttp = (status: 200, statusText: obj.StatusText, responseText: obj.ResponseText, responseXML: obj.ResponseXML,) try (settings.onComplete (fakeXMLHttp); return true;) catch (e) (globals.errorHandler (e);)) else (throw new Error ( "Le serveur a indiqué que ces données sont dans le cache");))) return false;)

 

Prenez un moment pour analyser le code. Vous devriez voir apparaître de nombreuses similitudes avec le code de requête unique client de cache. Les principales différences ont été mises en évidence en gras. Une grande différence dans la demande HTTPValProcessAndBreakBeforeRequest est l'ajout d'en-têtes HTTP validation de l'identification des ETag pour une demande précédemment exécutés. Puisque l'utilisation d'HTTP validation des moyens pour exécuter une demande, HTTPValProcessAndBreakBeforeRequest doit retourner false dans toutes les situations.

La fonction HTTPValProcessAndBreakAfterRequest est plus compliqué parce que sa logique est plus sophistiquée. Si la validation HTTP est utilisé et le serveur prend en charge HTTP validation, puis le serveur peut répondre de deux codes d'état HTTP de chaque requête: 200 et 304. Si le code d'état est de 200, soit les données ont changé ou que les données n'a jamais été changé.

Peu importe la raison pour laquelle le code d'état de 200, les données doivent être ajoutés à l'instance cache HttpValidationCacheController. La différence avec un grand respect dans le cache de requête unique client est le stockage supplémentaires de l'ETAG. Si le code de statut est 304, puis un exemple de faux XMLHttpRequest est créé et la méthode settings.onComplete est appelée, comme indiqué dans la mise en œuvre demande client unique cache. Définition et application de la REST URL L'architecture et la mise en œuvre du client à partir d'un général " que faire "point de vue est complète. Nous avons encore besoin de couvrir les détails de l'URL et l'architecture du serveur. À ce stade, je veux montrer, pour vous rafraîchir la mémoire. La séparation entre l'envoi et la réception de données est très importante car c'est ce qui permet à un client pour faire une demande d'aujourd'hui et demander la réponse demain. Si la question et la réponse devait être dans le contexte d'une requête unique, puis le client peut avoir à attendre pendant un temps très long.

Pour mettre cela dans un autre contexte, vous pouvez penser à la séparation de la demande et la réponse que la différence entre faire la queue pour l'aide à un magasin et en choisissant un numéro d'assistance. Imaginez shopping et acheter quelques morceaux de la taille spécialement de bois d'oeuvre. Chaque magasin de bois possède sa propre stratégie de servir ses clients. Une stratégie consiste à avoir la ligne de ses clients jusqu'à (queue) et d'attendre leur tour. Mais que faire si la ligne est longue? Vous serez tentés de se mettre en ligne? Que faire si vous décidez d'entrer en ligne et de réaliser que vous devez aller aux toilettes, ou vous avez besoin de mettre un peu d'argent dans le parcomètre? Le moment où vous sortez de la ligne, vous perdez votre position et ont pour démarrer le jeu d'attente dès le départ. D'un point de vue architectural files d'attente sont gênantes pour le serveur, car le serveur doit gérer la demande et garder l'attention de la connexion du client.

Une autre approche, et une qui est plus juste, est que chaque client qui veut une pièce spéciale de bois d'oeuvre sélectionne un certain nombre et remplit une ordonnance. L'ordre est soumis à un vendeur, et il ou elle vous dira à peu près lorsque le bois sera disponible. Pendant le temps d'attente, vous pouvez aller aux toilettes, prendre le déjeuner ou à l'atelier pour d'autres choses. L'ordre et l'approche symbolique, il est possible de découpler l'attente des clients du magasin pour optimiser le temps qu'il faut pour préparer les pièces spéciales de bois d'oeuvre. Par exemple, basé sur un ensemble de commandes, le magasin peut faire la queue les ordres en fonction des priorités, la capacité et la complexité. Cette architecture est unique parce que vous utilisez un HTTP POST pour soumettre la commande, et en retour vous recevez une indication du lieu où la code peut trouver la réponse. Vous n'avez pas à fournir l'indication, car cela pourrait être déterminée par programmation. Dans le cas de l'application ticker, l'emplacement est déterminé par programme.

 / pyservices / négociant / histoire / tickers

Cela représente une racine Web qui accepte les requêtes HTTP POST et GET. Exécution d'un EEG retournera une liste de liens vers tous les résultats disponibles. Les résultats pourraient être les résultats dans le sens pur calcul ou, dans le cas de l'application ticker, une liste des tickers être regardé. Obtenir une liste de tous les résultats disponibles ne sert à rien si vous ne savez pas ce que l'annonce moyens. L'application de ticker de son inscription est facile à déchiffrer, parce que chaque résultat représente un ticker surveillés. Mais que faire si la racine Web représente un calcul? La liste potentielle des résultats des URL peuvent inclure des nombres aléatoires utilisés pour indexer les résultats individuels. Ceci illustre le fait qu'il est extrêmement important d'être capable de distinguer des résultats basés sur des métadonnées. Si vous ne pouvez pas le faire, vous allez rencontrer des problèmes majeurs.

Parfois, cependant, vous ne voulez pas que tous les descripteurs de métadonnées. Si le poste exécute un calcul au cas où le résultat n'a de sens que dans un contexte spécifique, alors il est de la responsabilité du client de suivre les liens. Concernant ce concept à un panier d'achat, la plupart des magasins en ont, et il n'y a pas de descripteur de métadonnées. Quand vous êtes dans un magasin, vous savez ce qui vous appartient panier sur la base des articles dans le panier. Il n'y a pas d'identificateur de la charrette, et dans les paroles d'un grand comédien anglais, «Jusqu'à ce que vous achetez du contenu de votre panier d'achat, c'est une excellente façon de réaménager la nourriture dans un magasin." Je tiens à souligner que, oui , vous pouvez générer des résultats sans les métadonnées, mais ces situations sont spécialisées (et seront couverts à l'article 7). Lors de l'exécution un POST vers l'URL racine, vous commencez une tâche sur le côté serveur. À partir des tâches sur un serveur HTTP peut être difficile parce que les serveurs HTTP attendre tout le traitement doit être rempli pour la requête se termine. Toutefois, en raison de la nature des données, ce n'est pas possible, c'est pourquoi vous avez besoin d'étendre votre serveur.

Prolonger votre serveur peut être aussi simple que l'exécution d'un thread pour exécuter la tâche, ou il peut signifier faire un appel inter-processus pour démarrer un processus pour exécuter la tâche. Peu importe comment vous allez faire tourner la tâche, l'aspect important est de ne pas faire la tâche dans le contexte de la demande. Le rôle de la poste est de combiner les données pour une tâche, puis exécuter une tâche. Après que la demande a été présentée, le serveur doit renvoyer un identifiant qui représente la tâche. L'identifiant peut être le méta-données, un nombre aléatoire, ou un lien arbitraire. Les informations renvoyées devraient fournir suffisamment de données pour le client pour créer un lien algorithmiquement complet aux données et métadonnées.

Si le poste ne fournit aucune information d'ordre, alors l'hypothèse est que le client sait composer les métadonnées et le lien à partir des données soumises. L'inconvénient de cette stratégie est que si le serveur, les modifications des méta côté, le code côté client devront être mis à jour.

 / pyservices / négociant / histoire / Tickers / DELL

Cette URL représente l'URL racine d'un résultat. Seuls les verbes HTTP GET et DELETE sont pris en charge. Le verbe POST mai être pris en charge si vous souhaitez recalculer le résultat d'une demande. Le souci de l'exécution à un nouveau calcul est que dans un contexte multi-utilisateur, les autres utilisateurs verront les nouvelles données et ne pas être conscient que certaines parties des données ont changé. D'une manière générale, il est préférable de considérer un résultat comme immuable. Le verbe GET est soutenu pour permettre la récupération des résultats. Le verbe DELETE est soutenu pour élaguer un résultat sur la liste. Une taille est nécessaire pour que le cache ne pas s'encombrer avec des résultats anciennes qui n'ont aucun sens. Dans le cas de l'application ticker, DELETE ne serait pas approprié parce que l'histoire ticker est une série chronologique, et vous pouvez revenir en arrière. Une série d'élagage temps ne convient que si vous avez des données qui est considéré comme vieux et ne correspond pas au contexte.

 / pyservices/trader/historical/tickers/DELL/2006

Cette URL correspond une partie spécifique d'un résultat et, le cas échéant, devraient toujours être pris en charge. Soutenir les URL des enfants dans la suite le code du client permet d'affiner le résultat.

/ pyservices / négociant / histoire / Tickers / DELL? filter = maintenant

Cette URL représente une autre façon d'affiner les résultats. Par exemple, si un résultat génère trop de données, en utilisant le filtre d'une valeur de l'entreprise pourrait travailler à affiner le résultat à la dernière 15. Fine-tuning ne court le risque de résultats manquants. Par exemple, disons que vous êtes en attente pour tous des résultats d'un calcul, et donc régulièrement appel pour récupérer les résultats depuis 15. Que faire si la période de vérification est d'une heure, et pendant une heure, 30 résultats sont générés? En utilisant un filtre pour récupérer les moyens 15 derniers vous aurez raté 15 résultats. Vous ne devez pas utiliser une approche basée sur les tâches lors de la récupération du deletes1 dernières 15 pour maintenir la stabilité et la capacité de relire les résultats qui pourraient être perdues si un navigateur arrêté le téléchargement de la données. Vous voulez un moyen d'exécuter un remblai lorsque le cache seulement fiables ou mécanisme de stockage est le serveur.

La meilleure façon d'affiner les données retournées est d'utiliser un curseur sur l'ensemble de résultats. Par exemple, s'il ya 15 résultats à un calcul, en plus de l'URL mentionnée chaque résultat devraient être référencées à l'aide d'une URL unique qui identifie le nombre de résultats. Pensez au nombre résultat comme faisant partie d'une série chronologique. Dans une série de temps, vous pouvez récupérer toutes les tiques dans une heure, mais aussi toutes les cases en une minute et toutes les tiques en une seconde.

un article présenté par Sonja Lande


Disclaimer:Notre site n'est pas responsable du contenu de cet article. Webarticles est une ressource d'information gratuite.
Important: Cet article «Utiliser HTTP validation» a été traduit par un logiciel automatique. Nous nous sentons désolés pour les fautes d'orthographe que mai ont eu lieu. Nous vous remercions de votre compréhension.


Online: 488 users browsing the articles directory