544 votes

HTTP POST avec des paramètres de requête URL-une bonne idée ou pas?

Je suis de la conception d'une API pour aller sur HTTP et je me demandais si à l'aide de la commande HTTP POST, mais avec des paramètres de requête URL uniquement et pas de corps de la requête, est une bonne façon d'aller.

Considérations:

  • "Un bon design Web" exige non la quantité des actions pour être envoyés par la POSTE. C'est un non-idempotent d'action.
  • Il est plus facile de développer et déboguer cette application lorsque les paramètres de la requête sont présents dans l'URL.
  • L'API n'est pas destiné à une utilisation généralisée.
  • Il semble que de faire une requête POST avec pas de corps va prendre un peu plus de travail, par exemple, un Content-Length: 0 - tête doit être explicitement ajouté.
  • Il me semble aussi qu'un POST avec pas de corps est un peu contre la plupart des développeur et HTTP cadres attentes.

Sont-il plus de pièges ou d'avantages à l'envoi de paramètres dans une requête POST via l'URL de la requête plutôt que le corps de la requête?

Edit: La raison de ce qui est en cours d'examen est que les opérations ne sont pas idempotent et ont des effets secondaires autres que de la récupération. Voir la spécification HTTP:

En particulier, la convention a été établi que le GET et HEAD les méthodes ne DOIVENT PAS avoir le l'importance de prendre une autre action de récupération. Ces méthodes devraient être considérée comme "sûre". Cela permet à l'utilisateur les agents de représenter d'autres méthodes, comme le POST, PUT et DELETE, dans un de façon particulière, de sorte que l'utilisateur soit conscient du fait que, éventuellement, un dangereux d'action est demandée.

...

Les méthodes peuvent également avoir la propriété de "idempotence" qui (en dehors de erreur de l'expiration ou de questions) les effets secondaires de N > 0 identique les demandes de est le même que pour un seul demande. Les méthodes GET, HEAD, PUT et SUPPRIMER le partage de cette propriété. Aussi, les méthodes et OPTIONS de TRACE DOIT PAS d'effets secondaires, et sont donc intrinsèquement idempotent.

319voto

Don McCaughey Points 4433

Si votre action n'est pas la quantité, alors vous DEVEZ utiliser POST. Si vous ne le faites pas, vous êtes juste des ennuis en bas de la ligne. GET, PUT et DELETE méthodes sont nécessaires pour être idempotent. Imaginez ce qui se passerait dans votre application si le client a été pré-chargement possible d' GET votre demande pour votre service, si cela peut causer des effets secondaires visibles pour le client, alors quelque chose ne va pas.

Je suis d'accord que l'envoi d'un POST avec une chaîne de requête, mais sans un corps qui semble étrange, mais je pense qu'il peut être approprié dans certaines situations.

Pensez à la requête de la partie de l'URL d'une commande à la ressource, à la limite de la portée de la présente demande. Généralement, les chaînes de requête sont utilisées pour trier ou de filtrer un GET demande (comme ?page=1&sort=title) mais je suppose que cela a du sens sur un POST également de limiter le champ d'application (peut-être comme ?action=delete&id=5).

165voto

Tim Lovell-Smith Points 2635

Tout le monde à ce jour est de droit, coller avec de la POSTE pour les non-quantité de demandes.

Ce qui sur le mélange d'URI et de requêtes de contenu? C'est valable HTTP, donc pourquoi pas!

Spécification HTTP, (1.1) ne dit pas que les paramètres de la requête et le contenu sont mutuellement exclusives dans un serveur http de l'application qui accepte les requêtes POST, ou METTRE de la demande, pour que la matière de sorte que vous êtes libre d'accepter à la fois. Et bien sûr, si vous écrivez le serveur il n'y a rien pour vous empêcher de vous accepter à la fois (sauf peut-être un cadre rigide). Le serveur choisit comment interpréter les chaînes de requête toutefois qu'il veut. Et il peut l'interpréter de différentes souhaitez basé sur les en-têtes comme Type de Contenu trop, si elle veut.

Maintenant, si un navigateur web est le principal moyen que les gens accèdent à votre application web, application/x-www-form-urlencoded est le Type de Contenu qu'ils affichent, alors vous devez suivre les règles pour ce Type de Contenu, qui sont beaucoup plus spécifiques, et franchement, insolite: dans ce cas, vous devez interpréter l'Uri comme un ensemble de paramètres, et de ne pas l'emplacement d'une ressource. (C'est le point de l'utilité Powerlord soulevées, qu'il peut être difficile d'utiliser des formulaires web pour publier du contenu sur votre serveur, il suffit expliqué différemment.)

Note: ce sont les chaînes de requête à l'origine? RFC 3986 définit http chaînes de requête comme un uri partie qui fonctionne comme un non-hiérarchique façon de localiser une ressource.

Dans le cas où les lecteurs se posent cette question en essayant de se demander ce qui est acceptable Reposante de l'architecture, de détente, l'architecture n'est pas de prescrire des schémas URI de travailler d'une façon très spécifique, sauf pour la satisfaction des propriétés comme cacheability. Reposant architecture est plus préoccupé par les ressources elles-mêmes, leur comportement, les capacités et les représentations, et si idempotence est satisfait. Reposant architecture peut être moins préoccupés par la façon dont les ressources sont situées.

(Une autre remarque: parfois, les paramètres de la requête sont détournés à des fins autres que la recherche de ressources ou d'encodage de contenu. Jamais vu un paramètre de requête, comme METTRE=true ou POST=vrai? Ce sont des solutions de contournement pour l'application d'hôtes qui ne vous permet pas de vous envoyer des MISES et des requêtes POST en natif, mais seulement permettre d'OBTENIR.)

73voto

Powerlord Points 43989

Vous souhaitez raisons? En voici un:

Un formulaire web ne peut pas être utilisé pour envoyer une requête à une page qui utilise un mélange de GET et POST. Si vous définissez la forme de la méthode pour l'OBTENIR, tous les paramètres sont dans la chaîne de requête. Si vous définissez le formulaire en méthode POST, tous les paramètres sont dans le corps de la requête.

Source: HTML 4.01 standard, l'article 17.13 la Soumission d'un Formulaire

13voto

jro Points 5120

À partir d'un point de vue programmatique, pour le client c'est l'emballage jusqu'paramètres et en les ajoutant sur l'url et la réalisation d'un POST ou un GET. Sur le côté serveur, c'est l'évaluation entrant les paramètres de la requête au lieu de le posté octets. En gros, c'est un lavage.

Où il pourrait y avoir des avantages/inconvénients peut-être dans la façon de client spécifique des plates-formes de travail avec la POSTE et OBTENIR des routines dans leur pile de réseau, ainsi que la façon dont le serveur web traite ces demandes. En fonction de votre mise en œuvre, une approche peut être plus efficace que l'autre. Sachant guider votre décision ici.

Néanmoins, à partir d'un point de vue du programmeur, je préfère laisser un POST avec tous les paramètres dans le corps, ou avec tous les paramètres de l'url, et explicitement, en ignorant les paramètres d'url avec toute requête POST. Il permet d'éviter la confusion.

9voto

swizzcheez Points 21

Je pense qu'il pourrait encore être de tout repos pour la requête arguments qui permettent d'identifier les ressources sur l'URL tout en gardant le contenu de la charge utile limitée à la POST corps. C'est ce qui semble séparer les considérations de "Que suis-je envoyer?" et "Qui suis-je l'envoyer?".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X