Y a-t-il quelque chose de non-RESTful à propos de la fourniture de paramètres à une requête HTTP DELETE?
Mon scénario est que je modélise le "Êtes-vous sûr de vouloir supprimer cela?" scénario. Dans certains cas, l'état de la ressource suggère que la suppression demandée peut être invalide. Vous pouvez probablement imaginer vous-même certains scénarios où la confirmation d'une suppression est requise
La solution que nous avons adoptée est de passer un paramètre à la demande de suppression pour indiquer que vous pouvez procéder à la suppression ("? Force_delete = true")
par exemple
DELETE http://server/resource/id?force_delete=true
Je crois que c'est toujours reposant depuis:
(a) La sémantique de DELETE n'est pas modifiée - l'utilisateur peut toujours envoyer une demande DELETE normale mais cela peut échouer avec 409 et le corps de la réponse expliquera pourquoi. Je dis peut échouer parce que (pour des raisons qui ne valent pas la peine d'être expliquées) à certaines occasions, il n'y a aucune raison d'inviter l'utilisateur.
(b) Il n'y a rien dans la thèse de Roy qui suggère que c'est contre l'esprit de REST - pourquoi y en aurait-il puisque HTTP n'est qu'une implémentation de REST alors pourquoi le passage des paramètres HTTP serait-il important?
Quelqu'un peut-il m'indiquer une déclaration définitive qui explique pourquoi ce n'est pas RESTful?
Sur une question connexe, si l'utilisateur ne spécifie pas force_delete, je retourne 409 Conflict
- est-ce le code de réponse le plus approprié?
Suivre
Après quelques recherches supplémentaires, je pense que l'ajout de paramètres à DELETE peut enfreindre plusieurs principes.
La première est que l'implémentation viole peut-être l '«interface uniforme» (voir section 5.1.5 de la thèse de Roy
En ajoutant «force_delete», nous ajoutons une contrainte supplémentaire sur la méthode DELETE déjà bien définie. Cette contrainte n'a de sens que pour nous.
Vous pouvez également affirmer que cela enfreint le "5.1.2 Client-Serveur" car le dialogue de confirmation est vraiment un problème d'interface utilisateur et encore une fois, tous les clients ne voudront pas confirmer la suppression.
Suggestions quelqu'un?
Réponses:
Non, ce n'est pas RESTful. La seule raison pour laquelle vous devriez mettre un verb (
force_delete
) dans l'URI est si vous devez surcharger les méthodes GET / POST dans un environnement où les méthodes PUT / DELETE ne sont pas disponibles. À en juger par votre utilisation de la méthode DELETE, ce n'est pas le cas.Le code d'erreur HTTP
409/Conflict
doit être utilisé dans les situations où il y a un conflit qui empêche le service RESTful d'effectuer l'opération, mais il y a encore une chance que l'utilisateur puisse résoudre le conflit lui-même. Une confirmation de pré-suppression (où il n'y a pas de conflits réels qui empêcheraient la suppression) n'est pas un conflit en soi, car rien n'empêche l'API d'effectuer l'opération demandée.Comme l'a dit Alex (je ne sais pas qui a voté contre lui, il a raison), cela devrait être géré dans l'interface utilisateur, car un service RESTful en tant que tel ne traite que les demandes et devrait donc être apatride (c'est-à-dire qu'il ne doit pas s'appuyer sur des confirmations en tenant toute information côté serveur sur une requête).
Deux exemples de procédure dans l'interface utilisateur seraient les suivants:
(*) Veuillez noter que les versions HTML antérieures à 5 ne prennent pas en charge les méthodes HTTP PUT et DELETE de manière native, cependant la plupart des navigateurs modernes peuvent utiliser ces deux méthodes via des appels AJAX. Consultez ce fil pour plus de détails sur la prise en charge de plusieurs navigateurs.
Mise à jour (basée sur une enquête et des discussions supplémentaires):
Le scénario où le service exigerait que le
force_delete=true
drapeau soit présent viole l' interface uniforme telle que définie dans la thèse de Roy Fielding. De plus, selon HTTP RFC , la méthode DELETE peut être remplacée sur le serveur d'origine (client), ce qui implique que cela n'est pas fait sur le serveur cible (service).Ainsi, une fois que le service reçoit une demande DELETE, il doit la traiter sans avoir besoin de confirmation supplémentaire (peu importe si le service effectue réellement l'opération).
la source
force_delete=true
? Selon HTTP RFC, la méthode DELETE peut être remplacée sur le serveur d'origine (client), ce qui implique que cela n'est pas fait sur le serveur cible (service). Donc, je crois comprendre qu'une fois que le service reçoit une demande DELETE, il doit la traiter sans avoir besoin de confirmation (que le service effectue réellement l'opération).Je pense que ce n'est pas reposant. Je ne pense pas que le service de repos devrait gérer l'exigence de forcer l'utilisateur à confirmer une suppression. Je gérerais cela dans l'interface utilisateur.
La spécification de force_delete = true a-t-elle un sens s'il s'agissait de l'API d'un programme? Si quelqu'un écrivait un script pour supprimer cette ressource, voudriez-vous le forcer à spécifier force_delete = true pour supprimer réellement la ressource?
la source
C'est une vieille question, mais voici quelques commentaires ...
la source
En plus de la réponse d'Alex:
Notez que http: // serveur / ressource / id? Force_delete = true identifie une ressource différente de http: // serveur / ressource / id . Par exemple, il y a une énorme différence que vous supprimiez / clients /? Status = old ou / customers /.
Jan
la source