No artigo wiki para REST , é indicado que se você usar http://example.com/resources DELETE, isso significa que você está excluindo a coleção inteira.
Se você usar http://example.com/resources/7HOU57Y DELETE, significa que está excluindo esse elemento.
Estou fazendo um SITE, observe que NÃO É SERVIÇO NA WEB.
Tenho uma lista com 1 caixa de seleção para cada item da lista. Depois de selecionar vários itens para exclusão, permitirei que os usuários pressionem um botão denominado EXCLUIR SELEÇÃO. Se o usuário pressionar o botão, uma caixa de diálogo js aparecerá pedindo ao usuário para confirmar a exclusão. se o usuário confirmar, todos os itens serão excluídos.
Então, como devo tratar da exclusão de vários itens de forma RESTFUL?
OBSERVAÇÃO, atualmente para DELETE em uma página da web, o que eu faço é usar a tag FORM com POST como ação, mas incluir um _method com o valor DELETE, pois isso é o que foi indicado por outros no SO sobre como fazer RESTful delete para a página da web .
Respostas:
Acho que a resposta do rojoca é a melhor até agora. Uma ligeira variação pode ser, acabar com o javascript confirm na mesma página, e em vez disso, criar a seleção e redirecionar para ela, mostrando uma mensagem de confirmação nessa página. Em outras palavras:
De:
http://example.com/resources/
faça um
POSTAR com uma seleção de IDs para:
http://example.com/resources/selections
que, se bem-sucedido, deve responder com:
HTTP / 1.1 201 criado e um cabeçalho de localização para:
http://example.com/resources/selections/DF4XY7
Nesta página, você verá uma caixa de confirmação (javascript), que se você confirmar fará uma solicitação de:
DELETE http://example.com/resources/selections/DF4XY7
que, se bem-sucedido, deve responder com: HTTP / 1.1 200 Ok (ou o que for apropriado para uma exclusão bem-sucedida)
fonte
http://example.com/resources/selections/
e na carga útil (corpo) da solicitação você envia os dados para quais itens deseja excluir. Pelo que eu posso dizer, não há nada que o impeça de fazer isso, mas eu sempre recebo "mas não é RESTfull".Uma opção é criar uma "transação" de exclusão. Então você vai
POST
para algo comohttp://example.com/resources/deletes
um novo recurso que consiste em uma lista de recursos a serem excluídos. Então no seu aplicativo basta fazer o delete. Ao fazer a postagem, você deve retornar um local da transação criada, por exemplohttp://example.com/resources/deletes/DF4XY7
,. UmGET
pode retornar o status da transação (concluída ou em andamento) e / ou uma lista de recursos a serem excluídos.fonte
Aqui está o que a Amazon fez com sua API REST S3.
Solicitação de exclusão individual:
Solicitação de exclusão de vários objetos :
Mas a API Graph do Facebook , a API REST do Parse Server e a API REST do Google Drive vão ainda mais longe, permitindo que você "agrupe" operações individuais em uma solicitação.
Aqui está um exemplo do Parse Server.
Solicitação de exclusão individual:
Solicitação em lote:
fonte
Eu diria DELETE http://example.com/resources/id1,id2,id3,id4 ou DELETE http://example.com/resources/id1+id2+id3+id4 . Como "REST é uma arquitetura (...) [não] protocolo", para citar este artigo da Wikipedia, não existe, eu acredito, uma única maneira de fazer isso.
Estou ciente de que acima não é possível sem JS com HTML, mas tenho a sensação de que REST era:
fonte
Curiosamente, acho que o mesmo método se aplica ao PATCHing várias entidades e requer pensar sobre o que queremos dizer com nossa URL, parâmetros e método REST.
retornar todos os elementos 'foo':
[GET] api/foo
retornar elementos 'foo' com filtragem para ids específicos:
[GET] api/foo?ids=3,5,9
Onde o URL e o filtro determinam "com quais elementos estamos lidando?", E o método REST (neste caso "GET") diz "o que fazer com esses elementos?"
Portanto, faça PATCH em vários registros para marcá-los como lidos
[PATCH] api/foo?ids=3,5,9
..com os dados foo [ler] = 1
Finalmente, para excluir vários registros, este endpoint é mais lógico:
[DELETE] api/foo?ids=3,5,9
Por favor, entenda que não acredito que haja quaisquer "regras" sobre isso - para mim, apenas "faz sentido"
fonte
Como diz a resposta do Decent Dabbler e a resposta do rojocas , o mais canônico é usar recursos virtuais para excluir uma seleção de recursos, mas acho que isso é incorreto do ponto de vista REST, porque a execução de um
DELETE http://example.com/resources/selections/DF4XY7
deve remover o próprio recurso de seleção, não os recursos selecionados.Tomando a anwser Maciej Piechotka ou a resposta fezfox , só tenho uma objeção: há uma maneira mais canônica de passar um array de ids e está usando o operador array:
DELETE /api/resources?ids[]=1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d&ids[]=7e8f9a0b-1c2d-3e4f-5a6b-7c8d9e0f1a2b
Desta forma, você está atacando o endpoint Delete Collection, mas filtrando a exclusão com uma string de consulta da maneira correta.
fonte
Como não existe uma maneira 'adequada' de fazer isso, o que fiz no passado é:
envie DELETE para http://example.com/something com dados codificados em xml ou json no corpo.
ao receber a solicitação, verifique se há DELETE, se verdadeiro, então leia o corpo dos que serão excluídos.
fonte
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.
de tools.ietf.org/html/rfc7231#section-4.3.5Eu tive a mesma situação ao excluir vários itens. Isso é o que acabei fazendo. Usei a operação DELETE e os ids dos itens que deveriam ser excluídos faziam parte do cabeçalho HTTP.
fonte