Quand utilisez-vous POST et quand utilisez-vous GET?
D'après ce que je peux comprendre, il y a trois catégories:
- N'utilisez jamais
GET
et utilisezPOST
- N'utilisez jamais
POST
et utilisezGET
- peu importe lequel vous utilisez.
ai-je raison de supposer ces trois cas? Dans l'affirmative, quels sont les exemples tirés de chaque cas?
28 réponses
utilisez POST
pour des actions destructrices telles que la création (je suis conscient de l'ironie), l'édition, et la suppression, parce que vous ne pouvez pas frapper une POST
action dans la barre d'adresse de votre navigateur. Utilisez GET
quand il est sûr de permettre à une personne d'appeler une action. Donc une URL comme:
http://myblog.org/admin/posts/delete/357
devrait vous amener à une page de confirmation, plutôt que de simplement supprimer l'article. Il est beaucoup plus facile d'éviter les accidents de cette façon.
POST
est aussi plus sûr que GET
, parce que vous ne collez pas des informations dans une URL. Et donc utiliser GET
comme method
pour un formulaire HTML qui recueille un mot de passe ou d'autres informations sensibles n'est pas la meilleure idée.
Une dernière remarque: POST
peut transmettre une plus grande quantité d'informations que GET
. 'POST' n'a pas de restriction de taille pour les données transmises, tandis que 'GET' est limité à 2048 caractères.
en bref
- utiliser
GET
poursafe and idempotent
requêtes - utiliser
POST
pourneither safe nor idempotent
requêtes
en détail Il y a un endroit approprié pour chacun. Même si vous ne suivez pas RESTful principes, beaucoup peut être gagné d'apprendre sur le repos et la façon dont une ressource l'approche orientée fonctionne.
Une bonne application
use GETs
pour les opérations qui sont à la foissafe and idempotent
.
Un safe
l'opération est une opération qui ne not change the data
demandé.
une opération idempotent
est une opération dans laquelle le résultat sera be the same
peu importe combien de fois vous le demandez.
il va de soi que, comme GETs sont utilisés pour safe opérations ils sont automatiquement aussi idempotent . Typiquement, un GET est utilisé pour extraire une ressource (une question et ses réponses associées sur le débordement de la pile par exemple) ou la collecte de ressources.
une application RESTful utilisera
PUTs
pour les opérations qui sontnot safe but idempotent
.
je sais que la question était au sujet de GET and POST, mais je vais revenir à POST en une seconde.
typiquement, un PUT est utilisé pour éditer une ressource (éditer une question ou une réponse sur le débordement de la pile par exemple).
A
POST
serait utilisé pour toute opération qui estneither safe or idempotent
.
typiquement un POST serait utilisé pour créer une nouvelle ressource par exemple la création d'une nouvelle question SO (bien que dans certains designs un PUT serait utilisé pour cela aussi).
si vous lancez le POST deux fois, vous finiriez par créer deux nouvelles questions.
il y a aussi une opération de suppression, mais je suppose que je peux laisser cela là:)
Discussion
en termes pratiques, les navigateurs Web modernes ne prennent généralement en charge que GET et POST de manière fiable (vous pouvez effectuer toutes ces opérations via des appels javascript, mais en termes de saisie de données dans formulaires et en appuyant sur Soumettre vous avez généralement les deux options). Dans une application RESTful, le message sera souvent modifié pour fournir les appels PUT et DELETE également.
mais, même si vous ne suivez pas les principes RESTful, il peut être utile de penser en termes d'utiliser GET pour extraire / visualiser des informations et POST pour créer / éditer des informations.
vous ne devez jamais utiliser GET pour une opération qui modifie les données. Si un moteur de recherche explore une lien vers votre opération maléfique, ou le client Marque-pages il pourrait épeler de gros problèmes.
utilisez GET si cela ne vous dérange pas que la requête soit répétée (C'est-à-dire qu'elle ne change pas d'état).
Utiliser POST si l'opération change l'état du système.
Version Courte
GET: Généralement utilisé pour les présenté des demandes de recherche, ou pour toute demande d'où vous voulez que l'utilisateur soit en mesure de tirer vers le haut de la page exacte de nouveau.
avantages de GET:
Les URLs- peuvent être référencées en toute sécurité. Les Pages
- peuvent être rechargées en toute sécurité.
inconvénients de GET:
- les Variables sont passées par url comme les paires nom-valeur. (Risque pour la sécurité)
- nombre limité de variables pouvant être transmises. (Basé sur navigateur. Par exemple, Internet Explorer est limité à 2 048 caractères. )
POST: utilisé pour les demandes de haute sécurité où les données peuvent être utilisées pour modifier une base de données, ou une page que vous ne voulez pas que quelqu'un marque-page.
avantages de la poste:
- nom-valeur les paires ne sont pas affichées dans l'url. (Sécurité += 1)
- nombre illimité de paires nom-valeur peuvent être passées par la poste. référence.
inconvénients de la poste:
- Page qui utilise les données postales ne peut pas être un signet. (Si vous le souhaité.)
Version Longue
directement du Hypertext Transfer Protocol -- HTTP / 1.1 :
9.3 GET
la méthode GET signifie rechercher toute information (sous la forme d'une entité) identifiée par L'URI-Request. Si L'URI-demande fait référence à un processus de production de données, ce sont les données produites qui doivent être retournées en tant qu'entité dans la réponse et non le texte source du processus, à moins que ce texte ne soit le résultat du processus.
la sémantique du Obtenez le changement de méthode vers un "get conditionnel" si le message de requête inclut un champ d'en-tête If-Modified-Sinu, If-Unmodified-Sinu, If-Match, If-None-Match, ou If-Range. Une méthode de GET conditionnel demande que l'entité soit transférée uniquement dans les circonstances décrites par le(s) champ (s) d'en-tête conditionnel (s). La méthode D'accès conditionnel est destinée à réduire l'utilisation inutile du réseau en permettant aux entités mises en cache d'être rafraîchies sans nécessiter de requêtes multiples ou transférer des données déjà détenues par client.
la sémantique de la méthode GET change en" partial GET " si le message de requête inclut un champ D'en-tête Range. Un GET partiel demande que seule une partie de l'entité soit transférée, tel que décrit à la section 14.35. La méthode d'accès partiel vise à réduire l'utilisation inutile du réseau en permettant aux entités partiellement récupérées d'être complétées sans transfert de données déjà détenues par le client.
la réponse à une demande GET ne peut être mis en cache que s'il satisfait aux exigences de mise en cache HTTP décrites à la section 13.
voir la section 15.1.3 pour les considérations de sécurité lors de l'utilisation des formulaires.
9.5 POST
la méthode POST est utilisée pour demander que le serveur d'origine accepte entité incluse dans la requête comme des subalternes de la ressource identifié par L'URI de la demande dans la ligne de la demande. POST est conçu afin de permettre une méthode uniforme pour couvrir les fonctions suivantes:
Annotation des ressources existantes;
affichage d'un message sur un babillard, un groupe de discussion, une liste de diffusion, ou groupe similaire d'articles;
fourniture d'un bloc de données, tel que le résultat de la soumission d'un
Extension d'une base de données par une opération d'ajout.
serveur et dépend généralement de la requête-URI. Posté entité est subordonné que l'URI de la même manière qu'un fichier est subordonnée à un répertoire contenant elle, un article de nouvelles est subordonné à un groupe de discussion auquel il est posté, ou un dossier est subordonné à un la base de données.
L'action réalisée par la méthode POST pourrait ne pas aboutir à une ressource qui peut être identifiée par une URI. Dans ce cas, soit 200 (OK) ou 204 (Pas de Contenu) est la réponse appropriée état, selon que la réponse inclut ou non une entité qui décrit le résultat.
la première chose importante est le qui signifie de GET versus POST:
- GET devrait être utilisé pour... obtenir... quelques informations de le serveur,
- alors que POST doit être utilisé pour envoyer des informations à le serveur.
Après cela, un couple de choses qui peuvent être notés :
- en utilisant GET, vos utilisateurs peuvent utiliser le bouton "back" dans leur navigateur, et ils peuvent marquer des pages
- il y a une limite dans la taille des paramètres que vous pouvez passer comme GET (2KB pour certaines versions D'Internet Explorer, si Je ne me trompe) ; la limite est beaucoup plus pour le POST, et dépend généralement de la configuration du serveur.
Quoi qu'il en soit, je ne pense pas que nous pourrions" vivre " sans obtenir : pensez au nombre D'URL que vous utilisez avec des paramètres dans la chaîne de requête, chaque jour -- sans GET, tout cela ne fonctionnerait pas; -)
outre la différence de contraintes de longueur dans de nombreux navigateurs web, il y a aussi une différence sémantique. Les GETs sont censés être "sûrs" en ce sens qu'ils sont des opérations en lecture seule qui ne changent pas l'état du serveur. Les messages changent généralement d'état et donnent des avertissements lors de la nouvelle soumission. Les moteurs de recherche ' Web crawlers peuvent faire obtient mais ne devrait jamais faire des messages.
utilisez GET si vous voulez lire les données sans changer d'état, et utilisez POST si vous voulez mettre à jour l'état sur serveur.
ma règle générale est D'utiliser Get lorsque vous faites des requêtes vers le serveur qui ne vont pas modifier l'état. Les messages sont réservés pour les requêtes vers le serveur qui modifient l'état.
une différence pratique est que les navigateurs et les serveurs Web ont une limite sur le nombre de caractères qui peuvent exister dans une URL. C'est différent d'une application à l'autre, mais il est certainement possible d'y accéder si vous avez textarea
dans vos formulaires.
un autre gotcha avec GETs - ils sont indexés par les moteurs de recherche et d'autres systèmes automatiques. Google avait une fois un produit qui pré-récupérerait des liens sur la page que vous voyiez, de sorte qu'ils seraient plus rapides à charger si vous avez cliqué sur ces liens. Il a causé majeur ravages sur les sites qui avaient des liens comme delete.php?id=1
- les gens ont perdu leurs sites entiers.
utilisez GET lorsque vous voulez que l'URL reflète l'état de la page. Ceci est utile pour visualiser les pages générées dynamiquement, comme celles qui sont vues ici. Un message doit être utilisé dans un formulaire pour soumettre des données, comme quand je clique sur le bouton "Post Your Answer". Il produit aussi une URL plus propre puisqu'il ne génère pas de chaîne de paramètres après le chemin.
parce que Les GETs sont purement des URLs, ils peuvent être mis en cache par le navigateur web et peuvent être mieux utilisés pour des choses comme les images générées de façon constante. (Fixer une date de péremption)
un exemple tiré de la page gravatar: http://www.gravatar.com/avatar/4c3be63a4c2f539b013787725dfce802?d=monsterid
GET may yeild marginally better performance, certains webservers écrivent le contenu D'un POST dans un fichier temporaire avant d'invoquer le gestionnaire.
une Autre chose à considérer est la limite de taille. GETs sont plafonnés par la taille de L'URL, 1024 octets par la norme, bien que les navigateurs peuvent prendre en charge plus.
transférer plus de données que cela devrait utiliser un POST pour obtenir une meilleure compatibilité de navigateur.
encore moins que cette limite est un problème, comme l'a écrit un autre poster, n'importe quoi dans l'URL pourrait finir dans d'autres parties de l'interface utilisateur de brower, comme l'histoire.
il n'y a rien que vous ne puissiez faire en soi. Le fait est que vous n'êtes pas supposé pour modifier l'état du serveur sur un GET HTTP. Les mandataires HTTP supposent que puisque HTTP GET ne modifie pas L'état, que L'utilisateur invoque HTTP GET une fois ou 1000 fois ne fait aucune différence. En utilisant ces informations, ils supposent qu'il est sûr de retourner une version mise en cache du premier HTTP GET. Si vous ne respectez pas la spécification HTTP, vous risquez de casser le client HTTP et les mandataires dans la nature. Ne pas le faire :)
cette traversée dans le concept de repos et comment le web était en quelque sorte prévu sur être utilisé. Il y a un excellent podcast sur la radio de génie logiciel qui donne une discussion en profondeur sur l'utilisation de Get et Post.
Get est utilisé pour extraire des données du serveur, où une action de mise à jour ne devrait pas être nécessaire. L'idée étant que vous devriez être en mesure d'utiliser la même requête GET encore et encore et avoir les mêmes informations retournées. URL a l'information get dans la chaîne de requête, parce qu'il a été conçu pour être facilement envoyé à d'autres systèmes et les gens comme une adresse sur où trouver quelque chose.
Post est supposé être utilisé (au moins par l'architecture REST sur laquelle le web est en quelque sorte basé) pour pousser des informations vers le serveur/dire au serveur d'effectuer une action. Exemples comme: mettre à jour ces données, créer cet enregistrement.
1.3 Liste de contrôle rapide pour choisir HTTP GET
ou POST
utiliser GET if:
The interaction is more like a question (i.e., it is a safe operation such as a query, read operation, or lookup).
utiliser POST if:
The interaction is more like an order, or
The interaction changes the state of the resource in a way that the user would perceive (e.g., a subscription to a service), or
The user be held accountable for the results of the interaction.
Source .
Je ne vois pas de problème en utilisant get though, Je l'utilise pour des choses simples où il est logique de garder les choses sur la chaîne de requête.
L'utiliser pour mettre à jour l'état - comme un GET de delete.php?id=5
pour supprimer une page - est très risqué. Les gens ont découvert que lorsque L'accélérateur Web de Google a commencé préfetching URLs sur les pages - il a frappé tous les liens "supprimer" et effacé les données des personnes. La même chose peut arriver avec les araignées des moteurs de recherche.
POST peut déplacer de grandes données tandis que GET ne peut pas.
mais généralement il ne s'agit pas d'un raccourci de GET, plutôt une convention si vous voulez que votre site web/webapp se comporte bien.
From RFC 2616 :
9.3 GET
La méthode GET permet de récupérer toutes les informations (sous la forme de une entité) est identifiée par URI de demande. Si la requête-URI se réfère de données-processus de production, c'est la données produites qui doivent être retournées comme l'entité dans la réponse et non le texte source du processus, à moins que ce texte se trouve être le sortie de processus.
9.5 POST
la méthode POST est utilisée pour demander que le serveur d'origine accepter l'entité incluse dans le requête comme subordonné de l' ressource identifiée par la demande-URI dans la ligne de demande. POST est conçu pour permettre à une méthode uniforme de couvrir fonctions suivantes:
- Annotation de ressources existantes;
- affichage d'un message sur un babillard, un groupe de discussion, une liste de diffusion, ou groupe similaire d'articles;
- Fournir un bloc de données, comme le résultat de la soumission d'un formulaire, à un traitement des données;
- extension D'une base de données par une opération d'ajout.
La méthode de POST est déterminé par le serveur et dépend généralement de la URI de demande. L'entité affichée est subordonné à cette URI dans le même manière qu'un fichier est subordonnée à un répertoire contenant, un communiqué de l'article est subordonné à un groupe de discussion à laquelle il est publié, ou un enregistrement est subordonnée à une base de données.
l'action réalisée par le POST méthode pourrait ne pas entraîner une ressource qui peut être identifié par une URI. Dans ce cas, soit 200 (OK) ou 204 (Non Contenu) est la réponse appropriée statut, selon si oui ou non la réponse inclut une entité qui décrit le résultat.
j'utilise le POST quand je ne veux pas que les gens voient le QueryString ou quand le QueryString devient grand. En outre, POST est nécessaire pour les téléchargements de fichiers.
Je ne vois pas de problème à utiliser GET though, Je l'utilise pour des choses simples où il est logique de garder les choses sur la QueryString.
L'utilisation de GET permettra le lien vers une page particulière possible aussi où le POST ne fonctionnerait pas.
GET and POST permet essentiellement de renvoyer des informations vers le serveur web à partir d'un navigateur (ou d'un autre client HTTP d'ailleurs).
Imaginez que vous ayez un formulaire sur une page HTML et que le fait de cliquer sur le bouton "Soumettre" renvoie les données du formulaire au serveur, en paires "nom=valeur".
choisir GET comme "méthode" ajoutera toutes les données à L'URL et il apparaîtra dans la barre D'URL de votre navigateur. La quantité d'informations que vous pouvez renvoyer en utilisant un GET est restreint car les URLs ne peuvent être que 1024 caractères.
les défis de L'intégration du Cloud Télécharger Maintenant D'un autre côté, un message renvoie (typiquement) l'information via une socket vers le serveur web et ne s'affiche pas dans la barre D'URL. Vous pouvez envoyer beaucoup plus d'informations pour le serveur de cette façon - et il n'est pas limité aux données textuelles. Il est possible d'envoyer des fichiers, et même des données binaires comme des objets Java sérialisés!
L'intention originale était que GET était utilisé pour récupérer des données et POST devait être n'importe quoi. La règle empirique que j'utilise est que si je renvoie quelque chose au serveur, J'utilise POST. Si j'appelle une URL pour récupérer des données, J'utilise GET.
Lire l'article sur HTTP dans la Wikipedia . Il expliquera ce qu'est le protocole et ce qu'il fait:
GET
Demande une représentation de la ressource spécifiée. Notez que GET ne doit pas être utilisé pour les opérations qui causent des effets secondaires, tels que l'utilisation pour prendre des mesures dans les applications web. L'une des raisons en est que GET peut être utilisé arbitrairement par des robots ou crawlers, qui ne devrait pas avoir à considérer les effets secondaires qu'une demande devrait causer.
et
POST Soumet les données à traiter (p. ex. à partir d'un formulaire HTML) à la ressource identifiée. Les données sont incluses dans le corps de la demande. Cela peut entraîner la création d'une nouvelle ressource ou les mises à jour des ressources existantes ou les deux.
le W3C a un document nommé URIs, adressabilité, et L'utilisation de HTTP GET et POST qui explique Quand utiliser quoi. Citant
1.3 Liste de contrôle rapide pour choisir HTTP GET ou POST
- utiliser GET if:
- l'interaction ressemble davantage à une question (i.e., c'est une question de opération sûre telle qu'une requête, une opération de lecture ou une recherche).
et
- :
- l'interaction est plus comme un ordre, ou
- l'interaction modifie l'état de la ressource d'une manière que l'utilisateur percevrait (par exemple, un abonnement à un service), ou o L'utilisateur sera tenu pour responsable des résultats de l'interaction.
Toutefois, avant de prendre la décision finale D'utiliser HTTP GET ou POST, veuillez également tenir compte des considérations relatives aux données sensibles et des considérations pratiques.
un exemple pratique serait chaque fois que vous soumettez un formulaire HTML. Vous spécifiez soit post ou get pour l'action de formulaire. PHP peuplera $_GET et $_POST en conséquence.
en PHP, POST
la limite de données est généralement définie par votre php.ini
. GET
est limité par les paramètres du serveur/navigateur je crois - généralement autour de 255
octets.
version Simple du POST GET PUT supprimer utilisez GET-quand vous voulez obtenir n'importe quelle ressource comme la liste de données basée sur n'importe quel Id ou nom utilisez POST-lorsque vous voulez envoyer des données au serveur. gardez à l'esprit que POST est une opération lourde de poids parce que pour la mise à jour, nous devrions utiliser PUT à la place de POST en interne, le poste créera de nouvelles ressources utiliser METTEZ - lorsque vous
de w3schools.com :
Qu'est-ce que HTTP?
le protocole de transfert hypertexte (HTTP) est conçu pour activer communications entre clients et serveurs.
HTTP fonctionne comme un protocole request-response entre un client et un serveur.
d'Un navigateur web peut être le client, et une application sur un ordinateur qui héberge un site web peut être le serveur.
exemple: un client (navigateur) soumet une requête HTTP au serveur; ensuite, le serveur renvoie une réponse au client. Réponse contient des informations sur l'état de la demande et peut également contenir contenu demandé.
deux méthodes de requêtes HTTP: GET et POST
deux méthodes couramment utilisées pour une demande-réponse entre un client et les serveurs sont: GET et POST.
GET – Demande des données à partir d'une ressource spécifiée POST-soumet des données à être transformé en une ressource déterminée
Ici, nous distinguons les principales différences:
Eh bien, une chose importante est tout ce que vous soumettez plus de GET
va être exposé via L'URL. Deuxièmement, comme le dit Ceejayoz, il y a une limite sur les caractères pour une URL.
une autre différence est que POST nécessite généralement deux opérations HTTP, alors que GET n'en requiert qu'une.
Edit: je me dois de préciser--pour le commun des modèles de programmation. Généralement répondre à un message avec une page Web HTML droite est un design discutable pour une variété de raisons, dont l'un est l'ennuyeux "vous devez soumettre à nouveau ce formulaire, souhaitez-vous le faire?"en appuyant sur le bouton de retour.
comme répondu par d'autres, Il ya une limite à la taille de l'url avec get, et les fichiers peuvent être soumis avec post seulement.
j'aimerais ajouter qu'un peut ajouter des choses à une base de données avec un get et effectuer des actions avec un post. Lorsqu'un script reçoit un post ou un get, il peut faire tout ce que l'auteur veut qu'il fasse. Je crois que le manque de compréhension vient de la formulation que le livre a choisi ou de la façon dont vous l'avez lu.
un auteur de scénario devrait utiliser des postes de modifier la base de données et l'utilisation d'obtenir seulement pour la récupération de l'information.
les langues de script ont fourni de nombreux moyens pour accéder à la requête. Par exemple, PHP permet l'utilisation de $_REQUEST
pour récupérer un post ou un get. On devrait éviter cela en faveur du plus spécifique $_GET
ou $_POST
.
dans la programmation web, il y a beaucoup plus de place pour l'interprétation. Il y a ce que l'on devrait et ce que peut faire, mais ce qui est mieux est souvent à débattre. Heureusement, dans ce cas, il n'y a pas d'ambiguïté. Vous devrait utiliser des messages pour changer des données, et vous devrait utiliser Obtenir pour récupérer des informations.
Gorgapor, mod_rewrite
utilise encore souvent GET
. Il permet juste de traduire une URL plus conviviale dans une URL avec une chaîne de requête GET
.
HTTP POST data n'a pas de limite spécifiée sur la quantité de données, où Comme différents navigateurs ont des limites différentes pour obtenir. La RFC 2068 stipule:
les serveurs doivent être prudents en fonction des longueurs D'URI supérieures à 255 octets, parce que certains anciens clients ou proxy implémentations peuvent pas correctement soutenir ces longueurs
en particulier, vous devriez les constructions HTTP de droite pour ce qu'ils sont utilisés pour. Les HTTP GET ne devraient pas avoir d'effets secondaires et peuvent être rafraîchis et stockés en toute sécurité par des Proxies HTTP, etc.
les messages HTTP sont utilisés lorsque vous voulez soumettre des données contre une ressource url.
un exemple typique pour utiliser HTTP GET est sur une recherche, i.e. Search?Query=ma+requête Un exemple typique d'utilisation D'un message HTTP est la soumission de commentaires à un formulaire en ligne.