J'ai une page qui effectue la même demande JSONP plusieurs fois dans un chargement de page unique. Dans la plupart des navigateurs, cela fonctionne correctement, mais Safari met en cache la réponse localement jusqu'à ce que la page soit rechargée. Même lorsque je renvoie un en-tête Cache-Control: no-cache sur la réponse.Safari met en cache les demandes JSONP localement
considèrent le code exemple suivant:
var plcbCnt = 0;
var plcb = "plcb" + plcbCnt;
while(window[plcb]){
plcb = "plcb" + (++plcbCnt);
}
$.ajax({
"url": "http://myserver.com/echoDate",
"dataType": 'jsonp',
"jsonp": "cb",
"jsonpCallback": plcb,
"success": function(resp){
$("#pants").html($("#pants").html() + resp + "<br/>");
}
});
retours Première demande:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 28
Content-Type: application/javascript
Expires: -1
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=g0zwq2qiaheh4145cudddmjo; path=/
X-Powered-By: ASP.NET
Date: Wed, 20 Oct 2010 18:22:12 GMT
plcb0('634231777326425375');
Les appels suivants servent à partir du cache local, plutôt que de frapper le serveur comme ils le devraient.
Vous vous demandez probablement ce que cette partie supplémentaire au début concerne la fonction de rappel. Je pourrais juste utiliser un nombre aléatoire là-bas, non? Pas vraiment. Nous évitons le travail de rendu supplémentaire en mettant en cache la totalité de la sortie, en fonction de l'URL demandée. Donc, si je change le nom de la fonction de rappel à chaque requête, je perds les avantages du cache du serveur.
Je pense peut-être ajouter un paramètre garbage à la demande et faire en sorte que le cache du serveur soit supprimé de l'URL lors de la création de la clé de cache. Mais je voulais voir s'il y avait une meilleure option en premier ... quelque chose à propos de Safari que je ne connais pas.
Pourquoi n'utilisez-vous pas getJSON? http://api.jquery.com/jQuery.getJSON/ Fait la même chose à la fin. – epascarello
getJSON n'a pas la possibilité de définir le callback comme je le fais. Se base sur le paramètre par défaut, qui crée un nombre aléatoire à chaque fois. –