Alors que le Spécifications HTTP 1.1 semble permettre les corps de messages sur DELETE il semble indiquer que les serveurs devraient l'ignorer puisqu'il n'y a pas de sémantique définie pour cela.
4.3 Corps du message
Un serveur DOIT lire et transmettre un corps de message pour toute demande ; si la méthode de demande méthode de requête n'inclut pas la sémantique définie pour un corps de message, alors le corps de message DEVRAIT être ignoré lors du traitement de la demande.
J'ai déjà examiné plusieurs discussions connexes sur ce sujet sur SO et au-delà, telles que :
- Un corps d'entité est-il autorisé pour une demande HTTP DELETE ?
- Charges utiles des méthodes de requête HTTP
- HTTP GET avec le corps de la demande
La plupart des discussions semblent convenir que fournir un corps de message sur un DELETE peut être autorisé mais n'est généralement pas recommandé.
En outre, j'ai remarqué une tendance dans diverses bibliothèques client HTTP où de plus en plus d'améliorations semblent être enregistrées pour que ces bibliothèques prennent en charge les corps de requête sur DELETE. La plupart des bibliothèques semblent s'y plier, bien que parfois avec un peu de résistance initiale.
Mon cas d'utilisation nécessite l'ajout de certaines métadonnées requises lors d'un DELETE (par exemple, la "raison" de la suppression, ainsi que d'autres métadonnées requises pour la suppression). J'ai envisagé les options suivantes, dont aucune ne semble totalement appropriée et conforme aux spécifications HTTP et/ou aux meilleures pratiques REST :
- Corps du message - La spécification indique que les corps de message sur DELETE n'ont pas de valeur sémantique ; pas entièrement pris en charge par les clients HTTP ; pas de pratique standard.
- En-têtes HTTP personnalisés - Exiger des en-têtes personnalisés est généralement contre les pratiques standard ; leur utilisation est incompatible avec le reste de mon API, dont aucune ne nécessite d'en-têtes personnalisés ; de plus, il n'existe pas de bonne réponse HTTP pour indiquer les mauvaises valeurs d'en-têtes personnalisés (probablement une question distincte).
- En-têtes HTTP standard - Aucun en-tête standard n'est approprié
- Paramètres d'interrogation - L'ajout de paramètres d'interrogation modifie en fait l'URL de la demande qui est supprimée ; contre les pratiques standard
-
Méthode POST - (par exemple
POST /resourceToDelete { deletemetadata }
) POST n'est pas une option sémantique pour la suppression ; POST représente en réalité l'option en face de l'action souhaitée (par exemple, POST crée des subordonnés de la ressource ; mais je dois supprimer la ressource) - Méthodes multiples - Le fait de scinder la demande DELETE en deux opérations (par exemple, PUT delete metadata, puis DELETE) scinde une opération atomique en deux, laissant potentiellement un état incohérent. La raison de la suppression (et les autres métadonnées associées) ne font pas partie de la représentation de la ressource elle-même.
Ma première préférence serait probablement d'utiliser le corps du message, puis les en-têtes HTTP personnalisés ; toutefois, comme indiqué, ces approches présentent certains inconvénients.
Existe-t-il des recommandations ou des bonnes pratiques conformes aux normes REST/HTTP pour inclure ces métadonnées requises dans les demandes DELETE ? Existe-t-il d'autres solutions que je n'ai pas envisagées ?