Question

Voici la situation:

J'ai une application web qui réponse à une demande d'une liste de ressources, permet de dire:

/items

Ceci est d'abord demandé directement par le navigateur Web en accédant à ce chemin. Le navigateur utilise est-tête standard « Accepter » qui comprend « text / html » et mon application remarque et renvoie le contenu HTML pour la liste des éléments.

Dans le code HTML est retourné un peu de JavaScript (jQuery), qui fait alors une demande de paiement ajax pour récupérer les données réelles:

/items

Seulement, cette fois, le « Accepter » en-tête est explicitement définie sur « application / json ». Encore une fois, mon application remarque et JSON est correctement retourné à la demande, les données sont insérées dans la page, et tout est heureux.

Voici le problème : L'utilisateur accède à une autre page, et appuie plus tard sur la touche BACK. Ils sont ensuite invités à enregistrer un fichier. Cela se révèle être le JSON données de la liste des éléments.

Jusqu'à présent, je l'ai confirmé que cela se produise à la fois Google Chrome et Firefox 3.5.

Il y a deux types de réponses possibles ici:

  1. Comment puis-je résoudre le problème. Est il une combinaison magique de les en-têtes Cache-Control, ou autre voodoo qui provoque le navigateur pour faire la bonne chose ici?

  2. Si vous pensez que je suis en train de faire quelque chose horriblement mal ici, comment dois-je aller à propos de ça? Je cherche l'exactitude, mais aussi essayer de ne pas sacrifier flexibilité.

Si elle aide, l'application est une application Web JAX-RS, en utilisant Restlet 2.0m4. Je peux fournir des en-têtes demande d'échantillons / réponse si elle est utile, mais je crois que la question est tout à fait reproductible.

Était-ce utile?

La solution

  

Y at-il une combinaison magique des en-têtes Cache-Control, ou tout autre voodoo qui provoquent le navigateur pour faire la bonne chose ici?

Si vous servez des réponses différentes à différents Accepter: les en-têtes, vous devez inclure l'en-tête:

Vary: Accept

dans votre réponse. Vary en-tête devrait également contenir d'autres têtes de requête que influencer la réponse, donc par exemple si vous faites gzip / deflate vous auriez à inclure Accept-Encoding.

IE, gère malheureusement beaucoup de valeurs de Vary mal, briser complètement, ce qui en tant que cache pourrait ou pas d'importance pour vous.

  

Si vous pensez que je suis en train de faire quelque chose de terriblement mal ici, comment dois-je prendre?

Je ne pense pas que l'idée de contenus différents pour différents types en même URL est horriblement mal, mais vous vous laisse entrer pour plus de problèmes de compatibilité que vous avez vraiment besoin. En se fondant sur les en-têtes de travail par JSON est pas vraiment une bonne idée dans la pratique; vous seriez mieux loti d'avoir simplement une URL différente, comme /items/json ou /items?format=json.

Autres conseils

Je sais que cette question est vieux, mais juste au cas où quelqu'un d'autre dans Runs ceci:

Je faisais ce même problème avec une application Rails en utilisant jQuery, et je l'ai fixé en disant le navigateur pour ne pas mettre en cache la réponse JSON avec la solution donnée ici à une autre question:

jQuery $. getJSON ne fonctionne qu'une fois pour chaque contrôle. Ne pas atteint à nouveau le serveur

Le problème ne semble se produire avec Chrome et Firefox. Safari manipulait le comportement de retour correct sans avoir explicitement à lui dire de ne pas le cache.

Vieille question, mais pour tous ceux voir d'autre cela, il n'y a rien de mal avec l'utilisation de l'intervenant de l'en-tête Accept.

Ceci est un bug dans Chrome confirmée. (Auparavant également dans Firefox, mais depuis fixe.)

http://code.google.com/p/chromium/ questions / détail? id = 94369

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top