Ajax et cache HTTP
Par Laurent le jeudi 4 août 2011, 17:54 - Informatique - Lien permanent
Une requête XmlHttpRequest contenant un header "Cache-Control: no-cache" ne devrait-elle pas outrepasser le cache HTTP du navigateur ? Il semble que ce ne soit pas le cas, sauf dans Chrome.
Voici mon problème. J'ai développé un mashup de reporting qui va chercher des données journalières via une API REST. Je passe par un script proxy pour pouvoir faire mes requêtes. Le serveur est très lent (plusieurs minutes pour répondre...), j'ajoute donc 12h de cache dans la réponse renvoyée par le proxy. Je peux ainsi recharger mon mashup pendant la journée sans attendre.
Les données ne changent théoriquement pas pendant la journée. Exceptionnellement, il peut y avoir une mise à jour dans la journée. J'ai donc besoin d'un bouton "réactualiser" dans ce cas, quand je veux des données fraîches. D'où ma tentative d'utiliser "Cache-Control: no-cache" dans la requête, comme un navigateur fait quand on réactualise par un Ctrl+F5 ou Ctrl+R. Malheureusement, les navigateurs (FF5, IE7, Opera 11.5) ne semblent pas en tenir compte, ils me renvoient toujours les données en cache, sauf Chrome.
Le fait que ça marche dans Chrome me fait dire que mon idée n'était pas si mauvaise. Est-ce une mauvaise implémentation du cache (dans le cas de XMLHttpRequest) par les navigateurs ? Qu'en pensez-vous ?
Commentaires
1. Tout d'abord, petit élément de vocabulaire, je suppose que l'API est HTTP mais pas REST. ;) Enfin c'est difficile de savoir si elle est vraiment REST sans voir son fonctionnement.
2. Voir le code pourrait aider à te répondre et surtout les headers des requêtes et réponses HTTP au complet.
3. Ce que dit la spécification
http://dev.w3.org/2006/webapi/XMLHt...
If the user agent implements a HTTP cache it should respect Cache-Control request headers set by the setRequestHeader() (e.g., Cache-Control: no-cache bypasses the cache). It must not send Cache-Control or Pragma request headers automatically unless the end user explicitly requests such behavior (e.g. by reloading the page).
Mais surtout
For 304 Not Modified responses that are a result of a user agent generated conditional request the user agent must act as if the server gave a 200 OK response with the appropriate content. The user agent must allow setRequestHeader() to override automatic cache validation by setting request headers (e.g. If-None-Match or If-Modified-Since), in which case 304 Not Modified responses must be passed through.
Note que les implémentations sont toujours en voie de stabilisation.
Peux-tu donner plus de détails sur le HTTP Request envoyé par XMLHttpRequest?
Ceci dit Opera a quelques bugs à régler autour de XMLHttpRequest
Merci beaucoup pour ta réponse Karl.
L'API est dite "REST" par l'éditeur, c'est plus vendeur. Mais je ne me fais pas d'illusion, elle n'est surement pas vraiment REST.
J'ai essayé plusieurs choses comme entêtes. Là je cache la réponse avec uniquement "Cache-Control: max-age=43200". Et quand je veux outrepasser le cache, je mets "Cache-Control: no-cache" dans la requête.