Alors que la spécification HTTP 1.1 semble autoriser les corps de message sur les requêtes DELETE , elle semble indiquer que les serveurs devraient l'ignorer car il n'y a pas de sémantique définie pour cela.
4.3 Corps du message
Un serveur DEVRAIT lire et transmettre un corps de message sur toute demande; si la méthode de demande n'inclut pas la sémantique définie pour un corps d'entité, alors le corps de message DEVRAIT être ignoré lors du traitement de la demande.
J'ai déjà passé en revue plusieurs discussions connexes sur ce sujet sur le SO et au-delà, telles que:
- Un corps d'entité est-il autorisé pour une requête HTTP DELETE?
- Charges utiles des méthodes de requête HTTP
- HTTP GET avec le corps de la requête
La plupart des discussions semblent s'accorder sur le fait que fournir un corps de message sur un DELETE peut être autorisé , mais n'est généralement pas recommandé.
De plus, j'ai remarqué une tendance dans diverses bibliothèques clientes 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 obliger, bien que parfois avec un peu de résistance initiale.
Mon cas d'utilisation demande l'ajout de certaines métadonnées requises sur un DELETE (par exemple, la «raison» de la suppression, ainsi que d'autres métadonnées requises pour la suppression). J'ai examiné les options suivantes, dont aucune ne semble tout à fait 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 aucune valeur sémantique; pas entièrement pris en charge par les clients HTTP; pas une pratique courante
- En-têtes HTTP personnalisés - L'exigence d'en-têtes personnalisés est généralement contraire aux 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, aucune bonne réponse HTTP disponible pour indiquer de mauvaises valeurs d'en-tête personnalisées (probablement une question distincte)
- En-têtes HTTP standard - Aucun en-tête standard n'est approprié
- Paramètres de requête - L'ajout de paramètres de requête modifie en fait l'URI de la requête en cours de suppression; 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 fait l' action opposée souhaitée (c'est-à-dire que POST crée des subordonnés de ressources; mais je dois supprimer la ressource) - Méthodes multiples - La division de la demande DELETE en deux opérations (par exemple PUT delete métadonnées, puis DELETE) divise 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, ensuite les en-têtes HTTP personnalisés; cependant, comme indiqué, ces approches présentent certains inconvénients.
Existe-t-il des recommandations ou des meilleures pratiques en ligne avec les normes REST / HTTP pour inclure ces métadonnées requises dans les demandes DELETE? Y a-t-il d'autres alternatives que je n'ai pas envisagées?
Jersey
ne permettent pas le corps desdelete
requêtes.