940 votes

Est un corps d'entité autorisée pour un HTTP SUPPRIMER la demande?

Lors de la délivrance d'un HTTP SUPPRIMER la demande, l'URI de la demande doit identifier complètement la ressource à supprimer. Cependant, il est possible d'ajouter des méta-données dans le cadre de l'entité de la demande?

740voto

Tomalak Points 150423

La spec n'est pas explicitement interdire ou décourager, donc j'aurais tendance à dire que c'est autorisé.

Microsoft voit de la même façon (je les entends murmurer dans le public), dans l'article MSDN sur la Méthode de SUPPRESSION de ADO.NET infrastructure des Services de Données:

Si une demande de SUPPRESSION comprend un corps d'entité, le corps est ignoré [...]


EDIT: j'ai essayé de compiler un ensemble de règles à partir de la spécification.

Voici ce que la RFC2616 (HTTP 1.1) a à dire en ce qui concerne les demandes:

  • une entité n'est présent que lorsqu'un corps est présent (section 7.2)
  • la présence d'un message du corps est signalé par l'inclusion d'un Content-Length ou Transfer-Encoding - tête (section 4.3)
  • un message du corps ne doivent pas être incluses lors de la spécification de la méthode de la requête ne permet pas l'envoi d'une entité-corps (section 4.3)
  • une entité est explicitement interdit dans le suivi des demandes seulement, tous les autres types de demande sont sans restriction (article 9, et 9,8 spécifiquement)

Pour les réponses, ce qui a été défini:

  • si un message du corps est inclus dépend à la fois de la méthode de requête et de réponse d'état (section 4.3)
  • un message du corps est explicitement interdit dans les réponses à la TÊTE des demandes (article 9, et 9,4 spécifiquement)
  • un message du corps est explicitement interdit dans 1xx (informatif), 204 (pas de contenu), et 304 (non modifié) les réponses (section 4.3)
  • toutes les autres réponses inclure un message du corps, mais il peut être de longueur nulle (section 4.3)

294voto

grzes Points 291

La dernière mise à jour le HTTP 1.1 spec permet explicitement que les corps d'entité dans la demande de SUPPRESSION. Reportez-Vous À Cette

60voto

evan.leonard Points 466

Tomcat et Jetty semblent ignorer un corps d'entité si elle est présente. Ce qui peut être gênant si vous avez l'intention de le recevoir.

56voto

Neil McGuigan Points 10123

L'une des raisons d'utiliser le corps dans une demande de suppression pour le contrôle d'accès concurrentiel optimiste.

Vous lisez la version 1 d'un enregistrement.

GET /some-resource/1
200 OK { id:1, status:"unimportant", version:1 }

Votre collègue lit la version 1 de l'enregistrement.

GET /some-resource/1
200 OK { id:1, status:"unimportant", version:1 }

Votre collègue pour l'enregistrement et met à jour la base de données, la modification de la version 2 de la base de données

PUT /some-resource/1 { id:1, status:"important", version:1 }
200 OK

Vous essayez de supprimer le dossier:

DELETE /some-resource/1 { id:1, version:1 }
409 Conflict

Vous devriez obtenir une vision optimiste de verrouillage exception. Re-lire le dossier, de voir qu'il est important, et peut-être pas le supprimer.

Une autre raison pour les utiliser, il suffit de supprimer plusieurs enregistrements à la fois (par exemple, une grille avec des rangées de sélection de cases).

DELETE /messages
[{id:1, version:2},
{id:99, version:3}]
204 No Content

Vous ne pouvez pas utiliser les en-têtes HTTP pour supprimer plusieurs enregistrements en utilisant le verrouillage optimiste.

Cela fonctionne dans Tomcat (7.0.52) et Spring MVC (4.05), éventuellement w les versions antérieures:

@RestController
public class TestController {

    @RequestMapping(value="/echo-delete", method = RequestMethod.DELETE)
    SomeBean echoDelete(@RequestBody SomeBean someBean) {
        return someBean;
    }
}

29voto

Adam Rosenfield Points 176408

Il me semble que la RFC 2616 ne le précise pas.

À partir de la section 4.3:

La présence d'un corps dans une demande est signalée par le l'inclusion d'un Contenu ou de Longueur d'Encodage de Transfert de champ d'en-tête dans la demande du message d'en-têtes. Un message du corps ne DOIT PAS être inclus dans une demande si la spécification de la méthode de la requête (article 5.1.1) ne permet pas l'envoi d'une entité-corps dans les demandes. Un serveur DOIT lire et transférer un message-corps sur toute demande; si la méthode de la requête ne définit pas de la sémantique pour une entité-corps, puis le message-corps DOIT être ignorée lors de la manipulation de la demande.

Et la section 9.7:

La méthode DELETE demande au serveur d'origine, supprimez la ressource identifié par l'URI de Demande. Cette méthode PEUT être redéfinie par l'homme l'intervention (ou autre) sur le serveur d'origine. Le client ne peut pas être garanti que l'opération a été réalisée, même si l' le code d'état renvoyé depuis le serveur d'origine indique que l'action a été achevée avec succès. Toutefois, le serveur ne DEVRAIT PAS indiquer la réussite, sauf si, à la fois, la réponse est donnée, il a l'intention de supprimer la ressource ou le déplacer vers un inaccessible emplacement.

Une réponse positive DEVRAIT être de 200 (OK) si la réponse contient un entité décrivant l'état, 202 (Accepté) si l'action n'a pas encore été promulguée, ou 204 (Pas de Contenu) si l'action a été adopté mais la réponse ne comprennent pas une entité.

Si la demande passe par un cache et de la Demande-URI identifie un ou plusieurs en cache des entités, ces entrées DOIVENT être traités comme obsolète. Les réponses à cette méthode ne sont pas mis en cache.c

Il n'est donc pas explicitement autorisé ou non, et il y a une chance qu'un proxy le long de la voie pourrait enlever le corps du message (bien qu'il DOIT lire et de le transmettre).

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