Dans l'ensemble :
PUT et POST peuvent tous deux être utilisés pour la création.
Vous devez vous demander "sur quoi porte l'action ?", pour distinguer ce que vous devez utiliser. Supposons que vous conceviez une API pour poser des questions. Si vous voulez utiliser POST, vous le ferez sur une liste de questions. Si vous voulez utiliser PUT, vous le ferez pour une question particulière.
Super, les deux peuvent être utilisés, alors lequel dois-je utiliser dans ma conception RESTful :
Il n'est pas nécessaire de prendre en charge à la fois PUT et POST.
C'est à vous de décider lequel vous utilisez. Mais n'oubliez pas d'utiliser le bon en fonction de l'objet auquel vous faites référence dans la requête.
Quelques considérations :
- Nommez-vous les objets URL que vous créez explicitement, ou laissez-vous le serveur décider ? Si vous les nommez, utilisez PUT. Si vous laissez le serveur décider, utilisez POST.
- PUT est défini de manière à supposer l'idempotence, donc si vous PUT un objet deux fois, cela ne devrait avoir aucun effet supplémentaire. C'est une propriété intéressante, c'est pourquoi j'utiliserais PUT lorsque cela est possible. Assurez-vous simplement que l'idempotence de PUT est correctement implémentée dans le serveur.
- Vous pouvez mettre à jour ou créer une ressource avec PUT avec la même URL d'objet.
- Avec POST, deux requêtes peuvent arriver en même temps pour modifier une URL, et elles peuvent mettre à jour différentes parties de l'objet.
Un exemple :
J'ai écrit ce qui suit dans le cadre de une autre réponse sur SO à ce sujet :
POST :
Utilisé pour modifier et mettre à jour une ressource
POST /questions/<existing_question> HTTP/1.1
Host: www.example.com/
Notez que ce qui suit est une erreur :
POST /questions/<new_question> HTTP/1.1
Host: www.example.com/
Si l'URL n'est pas encore créée, vous ne devez pas utiliser POST pour la créer tout en spécifiant le nom. Cela devrait une erreur "ressource non trouvée" car car <new_question>
n'existe pas encore. Vous devez mettre le <new_question>
sur le serveur en premier.
Vous pouvez cependant faire quelque chose comme ceci pour créer une ressource en utilisant POST :
POST /questions HTTP/1.1
Host: www.example.com/
Notez que dans ce cas, le nom de la ressource n'est pas spécifié, les nouveaux objets vous sera renvoyé.
PUT :
Utilisé pour créer une ressource, ou l'écraser. Alors que vous spécifiez la nouvelle URL de la ressource.
Pour une nouvelle ressource :
PUT /questions/<new_question> HTTP/1.1
Host: www.example.com/
Pour écraser une ressource existante :
PUT /questions/<existing_question> HTTP/1.1
Host: www.example.com/
En outre, et de manière un peu plus concise, RFC 7231 Section 4.3.4 PUT (c'est nous qui soulignons),
4.3.4. PUT
La méthode PUT demande que l'état de la ressource cible soit created
o replaced
avec l'état défini par la représentation incluse dans les données utiles du message de demande.
67 votes
Il peut être utile d'utiliser les définitions de HTTPbis - Roy a fait un travail considérable pour les clarifier. Voir : tools.ietf.org/html/
20 votes
Afin d'adapter le commentaire de @MarkNottingham à la dernière révision, voici ce qui suit POST y PUT comme défini sur HTTPbis.
49 votes
Il me semble que ce débat est né de la pratique courante consistant à simplifier à l'extrême REST en décrivant les méthodes HTTP en termes d'opérations CRUD.
7 votes
Malheureusement, les premières réponses sont fausses concernant le POST. Vérifiez ma réponse pour une meilleure explication des différences : stackoverflow.com/a/18243587/2458234
35 votes
PUT et POST sont toutes deux des méthodes non sécurisées. Cependant, PUT est idempotent, alors que POST ne l'est pas. - Pour en savoir plus, consultez le site restcookbook.com/HTTP%20Methods/put-vs-post/
5 votes
Vous savez... Je réalise que la spécification fait référence à PUT en tant que "mise à jour", mais je pense que tout le monde serait beaucoup moins confus si nous disions "remplacé", c'est ce qu'il fait après tout.
3 votes
En pratique, POST fonctionne bien pour la création de ressources. L'URL de la ressource nouvellement créée doit être renvoyée dans l'en-tête de réponse Location. PUT doit être utilisé pour la mise à jour complète d'une ressource. Veuillez comprendre qu'il s'agit des meilleures pratiques lors de la conception d'une API RESTful. La spécification HTTP en tant que telle ne limite pas l'utilisation de PUT/POST à quelques restrictions près pour la création/mise à jour de ressources. Jetez un coup d'œil à techoctave.com/c7/posts/71-twitter-rest-api-dissected qui résume les meilleures pratiques.
4 votes
idempotency
est la clé. Lire PUT ou POST : Le REST de l'histoire par John Calcote . Si votre méthode est idempotente, choisissez PUT. Sinon, utilisez POST.2 votes
Je ne comprends pas la sagesse dominante à ce sujet. La citation du PO pour PUT commence par "La méthode PUT demande que l'entité jointe soit stockée....". Cela me fait penser à une "création". Lorsque nous parlons de "mettre" quelque chose quelque part, nous parlons d'un endroit où il n'était pas auparavant. On ne "met" pas quelque chose pour le changer. Lorsque vous modifiez un document, vous n'en "mettez" pas un nouveau. L'utilisation du verbe HTTP PUT pour signifier "mise à jour" est mal adaptée sur le plan sémantique.
1 votes
PUT a commencé comme un moyen pour les premiers outils de conception HTML de Microsoft de publier du contenu directement sur un serveur. Le fait qu'il ait également été utilisé pour mettre à jour (en gros) était dû à l'absence d'une autre méthode de mise à jour. Mais comme il s'agissait d'une mise à jour globale, il s'agissait bien d'une création, mais d'une création idempotente. Une "mise à jour" implique qu'un aspect de l'état précédent est maintenu.
1 votes
Scénario réel dans la documentation élastique : elastic.co/guide/fr/elasticsearch/reference/current/ . Regardez la différence entre toutes les requêtes PUT et le dernier exemple de requête POST.
0 votes
El
JavaBrains
l'explique de manière très claire. Jetez un coup d'oeil youtube.com/watch?v=rhTkRK53XdQ0 votes
Différence entre POST vs PUT Les méthodes doivent être décrites dans un contexte défini. Comme ici, la question porte sur REST, et il s'agit en fait de cohérence et d'interface uniforme. Jusqu'à ce que vous respectiez la cohérence de la conception de l'API, tout va bien.
0 votes
Notez que si vous voulez qu'une application Web fonctionne même si JavaScript est désactivé, vous devez utiliser POST : stackoverflow.com/questions/630453/put-vs-post-in-rest/
0 votes
La citation jointe de l'OP concernant le POST n'est plus valable. "La fonction réelle exécutée par la méthode POST est déterminée par le serveur et dépend généralement de l'URI de la demande effective. L'action exécutée par la méthode POST peut ne pas donner lieu à une ressource qui peut être identifiée par une URI. " via tools.ietf.org/html/
0 votes
Vous pouvez utiliser les deux. POST est utilisé si le serveur décide du nouvel URI de la ressource, PUT est utilisé si le client le décide. Voir : mscharhag.com/api-design/http-post-put-patch
0 votes
En général, dans la pratique, il faut toujours utiliser PUT pour les opérations UPDATE. Utilisez toujours POST pour les opérations CREATE. voir ce
0 votes
L'idempotence est importante. Mais, pour être idempotent, vous devez avoir une clé unique (ou un ensemble de clés). Si la clé unique est spécifiée deux fois dans un appel POST, le second devrait générer une erreur. Dans un appel PUT, elle doit créer/mettre à jour/remplacer la ressource. Il est possible d'avoir un appel POST et de ne pas fournir de clé unique (il crée simplement une nouvelle ressource à chaque fois). Cependant, il n'est pas possible de faire un appel PUT sans clé.
0 votes
Toutes ces discussions sur le fait que PUT est idempotent, et que POST ne l'est pas, ignorent l'éléphant dans la pièce. Le navigateur réessayera l'un ou l'autre, même POST, si la connexion est fermée par le serveur. Vous devez donc développer votre API de manière à ce qu'elle soit idempotente, de sorte que lorsque cela vous arrive, vous ne puissiez pas vous plaindre ! :) Le choix de la méthode est presque discutable. stackoverflow.com/questions/15155014/ w3.org/Protocoles/rfc2616/rfc2616-sec8.html#sec8.2.4