Je sais que HTTP PUT est une demande idempotente qui stocke quelque chose à un URI spécifique, selon la définition (citée de rfc )
The PUT method requests that the enclosed entity be stored under the supplied Request-URI.
Mais quelle est la définition de "l'entité fermée"? Il ne me semble pas possible d'envoyer des données de formulaire (comme pour HTTP POST)). Qu'en est-il de l'envoi de la représentation de l'entité via JSON/XML ou dans d'autres formats de sérialisation?
En bref, comment envoyer une demande HTTP PUT pour stocker/mettre à jour des informations sur un URI spécifique?
L'entité jointe correspond aux données utiles contenues dans le corps du message HTTP (après la suppression des encodages de transfert). Si vous rencontrez des problèmes pour envoyer le corps du message, il se peut que vous ayez oublié d'inclure un en-tête Content-Length - c'est l'une des deux façons d'indiquer que le message HTTP a un corps.
PUT est identique à POST à l'exception de cette différence sémantique: avec POST l'URI identifie une ressource qui gérera l'entité, comme une servlet. Avec PUT l'URI identifie l'entité elle-même, par exemple un fichier qui sera créé/remplacé par le contenu du corps de l'entité.
Dans REST vous avez:
GET - retrieve resource
POST - create new resource
PUT - update existing resource
DELETE - delete resource
Le verbe PUT est donc utilisé pour mettre à jour une ressource existante sur le serveur. Selon le client, il existe différentes manières d'envoyer une demande PUT. Par exemple avec jquery AJAX:
$.ajax({
type: 'PUT',
url: '/products/123',
data: { name: 'new product name' }
});
Ainsi, une demande HTTP PUT est souvent émise pour remplacer la ressource actuellement stockée à un URI donné. Par exemple, il y a un livre stocké à https://example.org/book/1 où les données peuvent être représentées en JSON comme suit,
$ curl --request GET https://example.org/book/1
{
"title": "Stackoverflow Compilation Book 1",
"year": 2019
}
Supposons que quelqu'un veuille corriger le champ year
parce que le livre de fiction a été publié l'année dernière (2018), il/elle devra envoyer les informations de livre mises à jour COMPLETE via une demande HTTP PUT.
$ curl --request PUT
--header "Content-Type: application/json"
--data '{"title": "Stackoverflow Compilation Book 1", "year": 2018}'
Notez la modification de l'attribut year
.
Considérant qu'une requête HTTP PUT est essentiellement une opération de remplacement, on peut également remplacer le livre représenté par l'URI par autre chose. Par exemple,
$ curl --request PUT
--header "Content-Type: application/json"
--data '{"title": "Some random book that nobody publishes", "year": 2019}'
Les données jointes peuvent être dans n'importe quel format (généralement également spécifié dans l'en-tête de la demande Content-Type
, comme indiqué ci-dessus), tant qu'il est pris en charge, généralement signalé par l'en-tête de réponse Accept
(qui indique le type de type de données que l'application est prête à traiter). Une validation supplémentaire serait gérée par le code de la demande afin de déterminer si les données soumises sont valides.
Vous envoyez un HTTP PUT où le corps est "l'entité fermée" que vous souhaitez stocker sous l'URL demandée. Très similaire au POST, seules les sémantiques spécifiées dans le RFC diffèrent.
Si l'URI de demande fait référence à une ressource déjà existante, l'entité incluse DEVRAIT être considérée comme une version modifiée de celle résidant sur le serveur d'origine. Si l'URI de demande ne pointe pas vers une ressource existante et que cet URI peut être défini comme nouvelle ressource par l'agent utilisateur demandeur, le serveur d'origine peut créer la ressource avec cet URI.