2013-08-20 1 views
0

J'ai une question, si quelqu'un peut donner un pseudo exemple comment est-ce géré, je l'apprécierais.Comment gérez-vous les modifications apportées à vos ressources?

Disons que ma demande a urls que vous pouvez exécuter une requête GET contre

/clients/{clientId}/contactsSummary 
/locations/{locationId}/contactsSummary 

et je veux faire encaisser. Maintenant si je fais POST/PATCH/DELETE sur

/contacts/{contactId} 

comment le cache est-il invalidé. De toute évidence, le changement, la création ou la suppression du contact entraînerait le retour des deux premières URLs dans la version mise en cache, ce qui serait incorrect. Quel est le mécanisme pour gérer cela?

Répondre

0

Si le frontal a absolument besoin des informations les plus récentes, ne mettez pas en cache. Sinon, ajoutez un délai d'expiration à chaque élément mis en cache, qui peut aller de 1 seconde à 1 heure (ou plus) à partir du moment où ils sont récupérés.

Vous pourriez avoir besoin de gérer les problèmes de cohérence. Par exemple, vous pourriez avoir une référence non expirée à un contact expiré. Supposons que cache est un dictionnaire d'une URL à un tuple (expires,data) Le pseudo-code pour récupérer une URL serait:

cacheItem= cache[ULR] 
if(cacheItem == null || cacheItem.expires < currentTime) 
    cacheItem= (currentTime + 1_hour , http_get(URL)) 
    cache[ULR]= cacheItem 
return cacheItem.data 
0

Le client décide s'il veut récupérer la représentation actuelle d'une ressource. Utilisez ce qu'on appelle "GET conditionnel".

La sémantique du changement de méthode GET à un "GET conditionnel" si le message de demande comprend un If-Unmodified-Depuis,-Since If-Modified, If-Match, If-None-Match, ou If- Champ d'en-tête de plage. Une méthode GET conditionnelle demande que l'entité soit transférée uniquement dans les circonstances décrites par le (s) champ (s) d'en-tête conditionnel (s). La méthode GET conditionnelle est destinée à réduire l'utilisation inutile du réseau en permettant aux entités mises en cache d'être actualisées sans nécessiter plusieurs demandes ou en transférant des données déjà détenues par le client.

(article 9.3 de http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)

Comment ça marche? C est le client, S est le serveur.

C

GET /path/to/resource 

S

200 OK 
ETag: foo 
Last-Modified: Tue, 15 Nov 1994 12:45:00 GMT 

C

Le client PUT s une version modifiée.

PUT /path/to/resource 
If-Match: foo 

S

Le client avait la version actuelle si une PUT sur la ressource est OK.

200 OK 
ETag: bar 
Last-Modified: Tue, 15 Nov 1994 12:46:00 GMT 

C

Le client PUT est une version modiefied mais en attendant, la ressource a changé et le ETag: bar ne correspond pas plus.

PUT /path/to/resource 
If-Match: bar 

S

412 Precondition Failed 

C

Le client GET s la version actuelle de la ressource.

GET /PATH/to/resource 

S

200 OK 
ETag: baz 
Last-Modified: Tue, 15 Nov 1994 12:47:00 GMT 

C

Maintenant, le client peut PUT à nouveau la ressource.

PUT /path/to/resource 
If-Match: ba7 

S

200 OK 
ETag: qux 
Last-Modified: Tue, 15 Nov 1994 12:48:00 GMT 
+0

Merci pour la réponse détaillée, mais ce n'est pas en fait ce que je demandais. Cela est logique lorsque nous parlons d'une URL, mais dans mon exemple, l'entité est en cours de modification, mais certains attributs de cette entité sont utilisés pour créer une ressource sur une URL différente. Cela a-t-il du sens? – epitka

Questions connexes