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?
Réponses
Trop de publicités?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
ouTransfer-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)
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
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;
}
}
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).