Est-il possible de cache méthodes POST en HTTP?
Très simples de mise en cache de la sémantique: si les paramètres sont les mêmes (et l'URL est la même, bien sûr), puis c'est un succès. Est-ce possible? Recommandé?
Vous devez vous connecter pour publier un commentaire.
Le correspondant La RFC 2616 dans l'article 9.5 de la (POST) permet la mise en cache de la réponse à un message, si vous utilisez les en-têtes appropriés.
Noter que la même RFC précise de manière explicite dans l'article 13 (mise en Cache HTTP) qu'un cache doit invalidation de l'entité après un POST demande.
Il n'est pas clair pour moi comment ces caractéristiques peuvent permettre de sens de la mise en cache.
Selon la RFC 2616 l'Article 9.5:
Donc, OUI, vous pouvez mettre en cache demande POST de réponse, mais seulement si elle arrive avec des en-têtes appropriés. Dans la plupart des cas, vous ne voulez pas mettre en cache la réponse. Mais dans certains cas - comme si vous n'êtes pas enregistrer les données sur le serveur c'est tout à fait approprié.
Noter, cependant, beaucoup de navigateurs, y compris Firefox 3.0.10, ne cache de la réponse POST indépendamment des en-têtes. IE se comporte plus intelligemment à cet égard.
Maintenant, je veux dissiper une certaine confusion en ce qui concerne la RFC 2616 S. 13.10. Méthode POST sur un URI n'est pas "invalider les ressources pour la mise en cache", comme certains l'ont dit ici. Il fait déjà un version en cache d'URI rassis, même si son cache-têtes de contrôle indiqué la fraîcheur de longue durée.
GET
etPOST
demandes. Si vous êtes un cache assis entre le client et le serveur, à vous de voirGET /foo
et vous mettre en cache la réponse. Ensuite, vous voyezPOST /foo
alors vous êtes obligatoire pour invalider la réponse en cache deGET /foo
même si lePOST
réponse ne comprennent pas les en-têtes parce qu'ils sont de la même URI, donc la prochaineGET /foo
aurez à revalider même si l'original des en-têtes indiqué le cache serait toujours en direct (si vous ne l'avait pas vu l'POST /foo
demande)Globale:
Fondamentalement La POSTE n'est pas une opération équipotente. Vous ne pouvez donc pas l'utiliser pour la mise en cache. OBTENEZ devrait être un idempotent de l'opération, de sorte qu'il est couramment utilisé pour la mise en cache.
Veuillez voir la section 9.1 de la HTTP 1.1 RFC 2616 S. 9.1.
Autre que de se de la méthode de la sémantique:
La méthode POST en lui-même est sémantiquement destinée à poster quelque chose à une ressource. POSTE ne peut pas être mis en cache, car si vous faites quelque chose une fois que vs vs deux fois par trois fois, puis vous modifiez la ressource du serveur à chaque fois. Chaque demande de questions et devrait être livré au serveur.
La méthode PUT lui-même est sémantiquement destiné à mettre ou de créer une ressource. C'est un idempotent de l'opération, mais il ne sera pas utilisé pour la mise en cache, car une SUPPRESSION pourrait avoir eu lieu dans l'intervalle.
La SUPPRESSION de la méthode elle-même est sémantiquement destinée à supprimer une ressource. C'est un idempotent de l'opération, mais il ne sera pas utilisé pour la mise en cache à cause d'un PUT pourrait avoir eu lieu dans l'intervalle.
Concernant la mise en cache côté client:
Un navigateur web va toujours de l'avant de votre demande, même si elle a une réponse d'un POST précédent l'opération. Par exemple, vous pouvez envoyer des emails avec gmail quelques jours d'intervalle. Ils peuvent être sur le même objet et le corps, mais les deux e-mails doivent être envoyés.
Concernant la mise en cache du proxy:
Un proxy serveur HTTP qui transmet votre message au serveur ne serait jamais cache quelque chose, mais un GET ou un CHEF de demande.
Concernant la cache du serveur:
Un serveur par défaut ne serait pas de traiter automatiquement une requête POST via la vérification de sa cache. Mais bien sûr, un POSTE de demande peut être envoyée à votre application ou d'extension, et vous pouvez avoir votre propre cache que vous lisez à partir de quand les paramètres sont les mêmes.
De l'invalidation d'une ressource:
La vérification de la HTTP 1.1 RFC 2616 S. 13.10 montre que la méthode POST doit invalider les ressources pour la mise en cache.
Si vous ne vous cache un POST de réponse, il doit être à la direction de l'application web. C'est ce que l'on entend par "les Réponses à cette méthode ne sont pas cachable, à moins que la réponse appropriée Cache-Control ou l'Expiration de champs d'en-tête."
On peut supposer que l'application, qui sait si oui ou non les résultats d'un POSTE sont idempotents, décide de savoir si ou de ne pas attacher le nécessaire et approprié de contrôle de cache-têtes. Si les en-têtes qui suggèrent la mise en cache est permis sont présents, l'application est pour vous dire que le POST est, en réalité, un super-GET; que l'utilisation des POSTES de travail a été nécessaire en raison de la quantité de l'inutile et sans intérêt (pour l'utilisation de l'URI comme une clé de cache) les données nécessaires pour effectuer l'opération équipotente.
GET suivantes peuvent être servis à partir de la cache sous cette hypothèse.
Une application qui ne parvient pas à joindre le nécessaire et de corriger les en-têtes de différencier entre cachable " et non cachable POST des réponses est en faute pour n'importe quel invalide en cache les résultats.
Cela dit, chaque POST qui frappe le cache nécessite la validation à l'aide conditionnelle en-têtes. Ceci est nécessaire afin d'actualiser le contenu du cache pour éviter d'avoir les résultats d'un POSTE de ne pas être reflétés dans les réponses aux demandes jusqu'à ce que après la durée de vie de l'objet expire.
Si c'est quelque chose qui n'est pas réellement modifier les données sur votre site, il devrait être d'une requête GET. Même si c'est un formulaire, vous pouvez toujours définir comme une requête get. Alors que, comme l'autre, vous pouvez mettre en cache les résultats d'un POST, ça n'aurait pas de sens sémantique, car un POST, par définition, est la modification des données.
Mark Nottingham a analysé lorsqu'il est possible de mettre en cache la réponse d'un POST. Notez que les demandes subséquentes qui veulent profiter de la mise en cache doit être GET ou HEAD demandes. Voir aussi httpbis
https://www.mnot.net/blog/2012/09/24/caching_POST.
Bien sûr, c'est possible. Si vous voulez prendre des requêtes POST envoyé à votre serveur, et de mettre en cache les données transmises à être ré-envoyé plus tard - pas de sueur.
La partie la plus délicate vient au sujet de "l'état". Comment décidez-vous les données que vous voulez envoyer à l'utilisateur devrait vraiment être le même? Que si les cookies ont changé, est - ce que modifier les données que vous voulez envoyer en arrière?
Que diriez-vous si l'utilisateur fait une requête POST vers votre page d'accueil, et depuis la dernière fois qu'il l'a fait, un autre utilisateur a envoyé un message (à l'aide d'un système à l'intérieur de votre site.) Vous devez identifier que comme un changement d'état, et envoyer la nouvelle version de votre page d'accueil, avec une notification de message à l'utilisateur la prochaine fois qu'il charge la page d'accueil. Même si le POSTE paramètres sont les mêmes.
Avec firefox 27.0 & avec httpfox, le 19 Mai 2014, j'ai vu une ligne de ce:
00:03:58.777 0.488 657 (393) la POSTE (Cache) texte/html https://users.jackiszhp.info/S4UP
Clairement, la réponse de la méthode post est mis en cache, et c'est aussi en https.
Incroyable!
POST est utilisée dans la dynamique de l'Ajax. De retour d'une réponse en cache pour un POSTE défaites le canal de communication et les effets secondaires de la réception d'un message. C'est très Très Mauvais. C'est aussi une vraie douleur pour la piste vers le bas. Hautement recommandé contre.
Un exemple trivial serait un message, comme un effet secondaire, verse votre salaire de 10 000 $la semaine en cours. Vous NE voulez PAS d'obtenir le "OK, il est passé par!" retour a été mis en cache, la semaine dernière. D'autres, plus complexes du monde réel cas entraîner dans les mêmes hilarité.