2010-02-01 4 views

Répondre

22

HTTP POST peut être mis en signet, mais comme un signet ne se compose que de l'URL, tous les paramètres seront perdues. Cela signifie souvent que le serveur Web ne sait pas quoi faire de la requête, car il attendait certains paramètres de formulaire. Si vous soumettez un formulaire via une requête GET, tous les paramètres du formulaire vont dans l'URL (après le?), Ainsi un signet contiendra toutes les informations nécessaires pour que le serveur web reconstruise la page une seconde fois (sauf pour les cookies, peut-être, mais un serveur Web est plus susceptible de gérer cela avec élégance)

+4

petit bémol: Depuis « bookmarked » a une forte implication d'un navigateur, et les navigateurs ne stockent pas la méthode HTTP associée à un signet, puis un POST ne peut pas vraiment être bookmarked. L'URL d'un POST peut être stockée et exécutée comme un POST répété, mais dans mon esprit, c'est différent d'un "signet". – Palpatim

8

Un POST ne peut pas être mis en signet. Tenter de mettre en signet un POST entraînera simplement une opération GET sur l'URL. Il y a une très bonne raison à cela, les requêtes GET sont supposées être idempotentes, c'est-à-dire que faire la même requête GET plusieurs fois devrait donner la même réponse. D'autre part, les requêtes POST ne le sont pas. Permettant à POSTs pourrait entraîner bookmarked vous payer pour quelque chose deux fois, transférer de l'argent de votre compte bancaire à nouveau, etc.

2

Dans une demande GET toutes les informations pour la demande est codée dans l'URL. Dans une demande POST, la demande est adressée à l'URL spécifiée, mais toutes les informations relatives à la demande, par ex. contenu du formulaire, est passé dans le corps de la demande.

Lorsque vous créez un signet pour une URL, vous ne placez que l'URL, mais pas le corps de la demande. Par exemple. Si vous remplissez un formulaire sur une page Web qui est ensuite transmise au serveur Web en tant que demande POST, et que vous ajoutez ensuite la page de réponse dans votre navigateur, le navigateur ne prendra en compte que l'URL, mais pas le corps du formulaire. En outre, lorsque vous ajoutez une page à un signet dans un navigateur, le signet inclut uniquement l'URL, mais pas la méthode de requête. Le navigateur utilise toujours GET pour tous les favoris.

5

Ce n'est pas que l'un ou l'autre ne peut pas être mis en signet. C'est plus que cliquer sur un signet toujours déclencher une demande GET! Cliquer sur un lien plain vanilla, un marque-page, un navigateur nav, entrer dans la barre d'adresse du navigateur, etc. déclenche une requête GET. Ils ne déclenchent jamais une demande POST. Une demande POST est normalement uniquement lorsque vous soumettez un HTML <form> qui est défini avec method="post". Vous pouvez parfaitement programmer le logiciel pour marquer une demande POST, mais ce n'est pas fait pour des raisons sensibles. La seule chose spéciale ici est qu'une demande GET est idempotent. En d'autres termes, il est garanti pour donner le même résultat chaque fois que vous l'invoquez. C'est assez simple car tous les paramètres de demande sont seulement disponibles dans la requête URL. Vous pouvez l'utiliser pour pré-traiter les données avant de l'afficher. Dans le monde de Java Servlet, vous utilisez normalement la méthode doGet() pour cela qui précharge certaines données en fonction des paramètres de requête à la fin, transmet la requête à un fichier JSP pour l'affichage.

Une demande de POST est cependant et non idempotent. En d'autres termes, il est pas garanti pour donner le même résultat chaque fois que vous l'invoquez. Tous les paramètres de demande sont inclus dans la demande corps. Il n'est pas visible pour l'utilisateur final et n'est pas visible dans l'URL de la demande. En d'autres termes, vous ne pouvez pas le mettre en signet. Vous pouvez l'utiliser pour post-traitement après un formulaire. Dans Java Servlet world, vous utilisez normalement la méthode doPost() pour cela qui rassemble les paramètres de la requête et les stocke dans une base de données et à la fin ou redirige la requête vers un fichier JSP pour résultat/confirmation/affichage.

+0

vraiment bien écrit. Est-ce que l'idempotence comprend également que la deuxième requête sera ignorée jusqu'à ce que la réponse de la première requête soit envoyée (dans le cas de GET). –

0

En fait, ce ne sont pas les demandes qui sont mises en signet, mais les URI.

Les paramètres GET sont envoyés dans le cadre de l'URL tandis que les paramètres POST sont envoyés dans le corps de la requête HTTP. POST est comme GET avec un second ensemble caché d'arguments qui ne sont pas visibles par l'utilisateur. C'est pourquoi vous êtes en mesure de faire une requête POST sur une URL qui contient des paramètres GET.
Pour plus de détails voir How are parameters sent in an HTTP POST request?

Bien que normalement signets contiennent des URL, ils peuvent aussi contenir du code JavaScript (ainsi nommé bookmarklets) et il y a des hacks pour faire des signets qui feraient la demande POST au lieu de GET.
Pour plus de détails voir How to save a bookmark in Firefox with POST data?

Questions connexes