Dans l' article wiki pour REST, il est indiqué que si vous utilisez http://example.com/resources DELETE, cela signifie que vous supprimez toute la collection.
Si vous utilisez http://example.com/resources/7HOU57Y DELETE, cela signifie que vous supprimez cet élément.
Je fais un SITE WEB, notez PAS DE SERVICE WEB.
J'ai une liste qui a 1 case à cocher pour chaque élément de la liste. Une fois que j'ai sélectionné plusieurs éléments à supprimer, je vais permettre aux utilisateurs d'appuyer sur un bouton appelé SUPPRIMER LA SÉLECTION. Si l'utilisateur appuie sur le bouton, une boîte de dialogue js apparaîtra pour demander à l'utilisateur de confirmer la suppression. si l'utilisateur confirme, tous les éléments sont supprimés.
Alors, comment dois-je gérer la suppression de plusieurs éléments de manière RESTFUL?
REMARQUE, actuellement pour DELETE dans une page Web, ce que je fais est d'utiliser la balise FORM avec POST comme action, mais j'inclus une méthode avec la valeur DELETE, car c'est ce qui a été indiqué par d'autres dans SO sur la façon de supprimer RESTful pour la page Web .
Réponses:
Je pense que la réponse de Rojoca est la meilleure à ce jour. Une légère variation pourrait être, pour supprimer la confirmation javascript sur la même page, et à la place, créer la sélection et la rediriger, en affichant un message de confirmation sur cette page. En d'autres termes:
De:
http://example.com/resources/
fait une
POST avec une sélection des ID à:
http://example.com/resources/selections
qui, en cas de succès, doit répondre par:
HTTP / 1.1 201 créé et un en-tête Location vers:
http://example.com/resources/selections/DF4XY7
Sur cette page, vous verrez alors une boîte de confirmation (javascript) qui, si vous confirmez, fera une demande de:
SUPPRIMER http://example.com/resources/selections/DF4XY7
qui, en cas de succès, devrait répondre avec: HTTP / 1.1 200 Ok (ou tout ce qui est approprié pour une suppression réussie)
la source
http://example.com/resources/selections/
et dans la charge utile (corps) de la demande, vous envoyez les données pour les éléments que vous souhaitez supprimer. Pour autant que je sache, rien ne vous empêche de faire cela, mais je me fais toujours rencontrer "mais ce n'est pas RESTfull".Une option consiste à créer une "transaction" de suppression. Donc, vous
POST
à quelque chose commehttp://example.com/resources/deletes
une nouvelle ressource consistant en une liste de ressources à supprimer. Ensuite, dans votre application, vous faites simplement la suppression. Lorsque vous faites la publication, vous devez renvoyer un emplacement de votre transaction créée, par exemplehttp://example.com/resources/deletes/DF4XY7
. UnGET
sur celui-ci pourrait renvoyer l'état de la transaction (terminée ou en cours) et / ou une liste de ressources à supprimer.la source
Voici ce qu'Amazon a fait avec son API S3 REST.
Demande de suppression individuelle:
Demande de suppression multi-objets :
Mais Facebook Graph API , Parse Server REST API et Google Drive REST API vont encore plus loin en vous permettant de «grouper» des opérations individuelles en une seule requête.
Voici un exemple de Parse Server.
Demande de suppression individuelle:
Demande de lot:
la source
Je dirais DELETE http://example.com/resources/id1,id2,id3,id4 ou DELETE http://example.com/resources/id1+id2+id3+id4 . Comme "REST est une architecture (...) [pas] un protocole" pour citer cet article de wikipedia, il n'y a, je crois, pas une seule façon de faire cela.
Je suis conscient que ci-dessus n'est pas possible sans JS avec HTML mais j'ai le sentiment que REST était:
la source
Fait intéressant, je pense que la même méthode s'applique au PATCHing de plusieurs entités et nécessite de réfléchir à ce que nous entendons par notre URL, nos paramètres et notre méthode REST.
renvoie tous les éléments 'foo':
[GET] api/foo
renvoie des éléments 'foo' avec filtrage pour des identifiants spécifiques:
[GET] api/foo?ids=3,5,9
En quoi l'URL et le filtre déterminent-ils "quels éléments nous traitons-nous?", Et la méthode REST (dans ce cas "GET") dit "que faire de ces éléments?"
Par conséquent, PATCH plusieurs enregistrements pour les marquer comme lus
[PATCH] api/foo?ids=3,5,9
..avec les données toto [lecture] = 1
Enfin, pour supprimer plusieurs enregistrements, ce point de terminaison est le plus logique:
[DELETE] api/foo?ids=3,5,9
S'il vous plaît, comprenez que je ne pense pas qu'il y ait de "règles" à ce sujet - pour moi, cela "a du sens"
la source
Comme le dit la réponse de Decent Dabbler et la réponse rojocas , le plus canonique consiste à utiliser des ressources virtuelles pour supprimer une sélection de ressources, mais je pense que c'est incorrect du point de vue REST, car l'exécution d'un
DELETE http://example.com/resources/selections/DF4XY7
devrait supprimer la ressource de sélection elle-même, pas les ressources sélectionnées.En prenant la réponse Maciej Piechotka ou la réponse fezfox , je n'ai qu'une objection: il existe une manière plus canonique de transmettre un tableau d'identifiants, et utilise l'opérateur de tableau:
DELETE /api/resources?ids[]=1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d&ids[]=7e8f9a0b-1c2d-3e4f-5a6b-7c8d9e0f1a2b
De cette façon, vous attaquez le point de terminaison Supprimer la collection mais en filtrant la suppression avec une chaîne de requête de la bonne manière.
la source
Comme il n'y a pas de moyen `` approprié '' de faire cela, ce que j'ai fait dans le passé est:
envoyer DELETE à http://example.com/something avec des données codées xml ou json dans le corps.
lorsque vous recevez la demande, vérifiez DELETE, si vrai, puis lisez le corps pour ceux à supprimer.
la source
A payload within a DELETE request message has no defined semantics; sending a payload body on a DELETE request might cause some existing implementations to reject the request.
depuis tools.ietf.org/html/rfc7231#section-4.3.5J'ai eu la même situation pour supprimer plusieurs éléments. C'est ce que j'ai fini par faire. J'ai utilisé l'opération DELETE et les identifiants des éléments qui devaient être supprimés faisaient partie de l'en-tête HTTP.
la source