web-dev-qa-db-fra.com

Si une opération 'PUT' RESTful renvoie quelque chose

Je me demandais ce que pensaient les gens d'une opération RESTful PUT qui ne renvoie rien (null) dans le corps de la réponse.

385
AwkwardCoder

La spécification HTTP ( RFC 2616 ) contient un certain nombre de recommandations applicables. Voici mon interprétation:

  • Code de statut HTTP 200 OK pour une mise à jour réussie d'une mise à jour d'une ressource existante. Aucun corps de réponse nécessaire. (Par Section 9.6 , 204 No Content est encore plus approprié.)
  • Code d'état HTTP 201 Created pour le PUT d'une nouvelle ressource, l'URI le plus spécifique correspondant à la nouvelle ressource étant renvoyé dans le champ d'en-tête Location et tout autre URI et métadonnées pertinents de la ressource en écho dans le corps de la réponse. ( RFC 2616 section 10.2.2 )
  • Code de statut HTTP 409 Conflict pour un PUT qui échoue à cause d'un 3rd-Partie modification, avec une liste des différences entre la tentative de mise à jour et la ressource actuelle dans le corps de la réponse. ( RFC 2616 Section 10.4.1 )
  • Code d'état HTTP 400 Bad Request pour un PUT infructueux, avec un texte en langage naturel (tel que l'anglais) dans le corps de la réponse qui explique l'échec du PUT. ( RFC 2616 section 10.4 )
557
system PAUSE

Contrairement à la plupart des réponses ici, je pense en fait que PUT devrait renvoyer la ressource mise à jour (en plus du code HTTP bien sûr).

La raison pour laquelle vous souhaitez renvoyer la ressource en réponse à une opération PUT est que, lorsque vous envoyez une représentation de ressource au serveur, celui-ci peut également appliquer un traitement à cette ressource. Le client souhaite donc savoir comment cette ressource est utilisée. ressembler à après la demande terminée avec succès. (sinon, il devra émettre une autre demande GET).

147
LiorH

Je pense qu'il est possible pour le serveur de renvoyer du contenu en réponse à un PUT. Si vous utilisez un format d’enveloppe de réponse qui autorise les données rechargées de manière latérale (telles que le format utilisé par les données de membre), vous pouvez également inclure d’autres objets éventuellement modifiés via des déclencheurs de base de données, etc. # de demandes, et cela semble être un bon endroit pour optimiser.)

Si j'accepte simplement le PUT et que je n'ai rien à signaler, j'utilise le code d'état 204 sans corps. Si j'ai quelque chose à signaler, j'utilise le code d'état 200 et j'inclus un corps.

2
shaunc

Le HTTP/1.1 spec (section 9.6) décrit les codes de réponse/d'erreur appropriés. Cependant, cela ne concerne pas le contenu de la réponse.

Qu'attendrais-tu? Un simple code de réponse HTTP (200, etc.) me semble simple et sans ambiguïté.

2
Brian Agnew

J'ai utilisé l'API RESTful dans mes services, et voici mon opinion: Tout d'abord, nous devons obtenir une vue commune: PUT est utilisé pour mettre à jour une ressource non créée ou récupérée.

J'ai défini les ressources avec: Stateless resource et Stateful resource:

  • Ressources sans état Pour ces ressources, il suffit de renvoyer le HttpCode avec un corps vide, c'est suffisant.

  • Ressources avec état Par exemple: la version de la ressource. Pour ce type de ressources, vous devez fournir la version lorsque vous souhaitez la modifier. Renvoyez donc la ressource complète ou la version au client. Le client n'a donc pas besoin d'envoyer une requête get après l'action de mise à jour.

Mais , pour un service ou un système, conservez-le simple, clearly, easy to use and maintain est la chose la plus importante.

1
Bruce

Code de réponse HTTP de 201 pour "Créé" avec un en-tête "Lieu" pour indiquer l'endroit où le client peut trouver la ressource nouvellement créée.

1
dc360

Si le backend de l'API REST est une base de données relationnelle SQL, alors

  1. vous devriez avoir RowVersion dans chaque enregistrement pouvant être mis à jour (pour éviter le problème de mise à jour perd )
  2. vous devriez toujours renvoyer une nouvelle copie de l'enregistrement après PUT (pour obtenir le nouveau RowVersion ).

Si vous ne vous souciez pas des mises à jour perdues, ou si vous voulez forcer vos clients à effectuer une opération GET immédiatement après un PUT, ne renvoyez rien dans PUT.

0
John Henckel