Un corps d'entité est-il autorisé pour une requête HTTP DELETE?

lors de l'émission D'une requête HTTP DELETE, L'URI de la requête doit identifier complètement la ressource à supprimer. Toutefois, est-il possible d'ajouter des métadonnées supplémentaires dans le corps de la requête?

533
demandé sur Haacked 2008-11-18 21:14:26

9 réponses

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

Microsoft le voit de la même façon (je peux entendre murmurer dans le public), ils déclarent dans L'article de MSDN sur le supprimer la méthode de ADO.NET cadre des services de données :

si une demande de suppression inclut un corps d'entité, le corps est ignoré [...]

en outre, voici ce que RFC2616 (HTTP 1.1) A à dire en ce qui concerne les requêtes:

  • un entité n'est présent que lorsqu'un corps est présent (section 7.2)
  • la présence d'un corps du message est signalée par l'inclusion d'un en-tête Content-Length ou Transfer-Encoding (section 4.3)
  • un 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'un entité (section 4.3)
  • un 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, cela a été défini:

  • si un message-corps est inclus dépend à la fois de la méthode de demande et de état de la réponse (section 4.3)
  • un corps est explicitement interdit dans les réponses à la TÊTE des demandes (article 9, et 9.4),
  • un 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 comprennent un corps de message, bien qu'il puisse être de longueur zéro (section 4.3)
432
répondu Tomalak 2017-06-09 02:59:19

la dernière mise à jour de la spécification HTTP 1.1 ( RFC 7231 ) autorise explicitement un organisme d'entité dans une demande de suppression:

une charge utile comprise dans un message de demande de suppression n'a pas de sémantique définie; l'envoi d'un corps de charge utile sur une demande de suppression pourrait entraîner le rejet de la demande par certaines implémentations existantes.

120
répondu grzes 2017-10-19 12:44:25

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

48
répondu evan.leonard 2015-07-06 12:07:40

L'une des raisons d'utiliser le corps dans une demande de suppression est un contrôle optimiste de la concurrence.

vous avez lu la version 1 d'un disque.

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

votre collègue lit la version 1 du procès-verbal.

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

votre collègue modifie l'enregistrement et met à jour la base de données, qui met à jour la version à 2:

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

vous essayez de supprimer l'enregistrement:

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

You on devrait avoir une exception optimiste. Relis le dossier, vois s'il est important, et peut-être pas le supprimer.

une autre raison de l'utiliser est de supprimer plusieurs enregistrements à la fois (par exemple, une grille avec des cases à cocher pour la sélection des lignes).

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

notez que chaque message a sa propre version. Peut-être Pouvez-vous spécifier plusieurs versions en utilisant plusieurs en-têtes, mais par George, c'est plus simple et beaucoup plus pratique.

This fonctionne dans Tomcat (7.0.52) et printemps MVC( 4.05), peut-être w versions précédentes aussi:

@RestController
public class TestController {

    @RequestMapping(value="/echo-delete", method = RequestMethod.DELETE)
    SomeBean echoDelete(@RequestBody SomeBean someBean) {
        return someBean;
    }
}
43
répondu Neil McGuigan 2015-08-15 22:15:48

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

de la section 4.3:

La présence d'un corps dans une demande est signalée par le inclusion d'un champ D'en-tête Content-Length ou Transfer-Encoding dans les en-têtes de message de la demande. Un corps de message 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 d'envoyer une entité-corps dans les demandes. Un serveur DOIT lire et transmettre un corps de message sur n'importe quelle requête; si la méthode de requête ne comprend pas la sémantique définie pour une entité-corps, puis le message-body doit être ignoré lors du traitement de la requête.

et section 9.7:

la méthode de suppression demande que le serveur d'origine supprime la ressource identifié par la demande-URI. Cette méthode peut être dépassée par les humains l'intervention (ou d'autres des moyens) 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 le succès, à moins que, au moment où la réponse est donnée, il intention de supprimer la ressource ou de la déplacer à un inaccessible emplacement.

une réponse réussie doit être de 200 (OK) si la réponse comprend un entité décrivant le statut, 202 (acceptée) si l'action n'a pas 204 (pas de contenu) si l'action a été adoptée mais la réponse n'inclut pas une entité.

si la requête passe par un cache et que l'URI de la requête identifie une ou plusieurs entités actuellement mises en cache, ces entrées devraient être traités comme obsolète. Les réponses à cette méthode ne peuvent pas être mises en cache.c

donc ce n'est pas explicitement autorisé ou refusé, et il y a une chance qu'un mandataire le long du chemin pourrait enlever le corps du message (bien qu'il devrait le lire et le transmettre).

27
répondu Adam Rosenfield 2008-11-18 18:37:21

juste un avertissement, si vous fournissez un corps dans votre demande de suppression et que vous utilisez un répartiteur de charge HTTPS de Google cloud, il rejettera votre demande avec une erreur 400. Je me cognais la tête contre un mur et j'ai découvert que Google, pour une raison quelconque, pense qu'une demande de suppression avec un corps est une demande mal formée.

12
répondu Ben Fried 2016-05-25 23:46:25

il semble que ElasticSearch utilise ce: https://www.elastic.co/guide/en/elasticsearch/reference/5.x/search-request-scroll.html#_clear_scroll_api

ce qui signifie que Netty supporte ceci.

comme mentionné dans les commentaires il ne peut plus être le cas

7
répondu Sebastien Lorber 2017-03-16 16:48:24

n'est pas défini .

une charge utile comprise dans un message de demande de suppression n'a pas de sémantique définie; l'envoi d'un corps de charge utile sur une demande de suppression pourrait causer les implémentations de rejeter la demande.

https://tools.ietf.org/html/rfc7231#page-29

6
répondu Simon Jin 2017-01-09 07:43:46

dans le cas où quelqu'un se heurte à ce problème de test, non il n'est pas universellement pris en charge.

je suis en train de tester avec Sahi Pro et il est très apparent un http supprimer des bandes d'appel toutes les données corporelles fournies (une grande liste d'id à supprimer en vrac selon la conception de point final).

j'ai été en contact avec eux à plusieurs reprises ainsi que envoyé dans trois paquets distincts de scrips, images, journaux pour eux de revoir et ils n'ont toujours pas confirmé ce. Un patch raté, et une conférence téléphonique manquée par leur support plus tard et je n'ai toujours pas eu une réponse solide.

Je suis certain que Sahi ne supporte pas cela, et j'imagine que beaucoup d'autres outils suivent suite.

3
répondu parker 2015-08-21 20:29:30