Eu tenho uma coleção de produtos em um grupo de produtos, por exemplo:
product-groups/123/products
Se eu precisar adicionar à coleção, posso aprovar apenas alguns produtos com PUT?
Se eu precisar excluir alguns produtos da coleção, posso transmitir dados de filtro (uma matriz de IDs) com DELETE?
Qual é a melhor maneira de implementar a funcionalidade no espírito do ReST?
Editar: os itens são links para entidades separadas, basicamente IDs de produtos.
rest
collections
user151851
fonte
fonte
Respostas:
Em geral, você tem um ponto final que representa toda a coleção de x :
Digamos, você deseja atualizar um único produto, faça um PUT para
/products/{id}
. Se você deseja atualizar parcialmente um único produto (não atualizando todos os campos), também pode usar um PATCH para/products/{id}
. O mesmo vale para a exclusão de uma única entidade ( DELETE to/products/{id}
).Se você deseja direcionar um único recurso, qualifica-se através do caminho, qual recurso único , que deseja modificar.
A única ação que interrompe o esquema é a criação de um recurso. Ao criar um recurso, você direciona a coleção como um todo, diga POST para
/products
.Dito isto, deve ficar claro que o destino das operações que afetam a coleção como um todo deve ir para o terminal de coleta apropriado.
Por exemplo, você deseja recuperar um subconjunto de produtos vermelho, solicita-o
GET para
/products?colour=red
.Portanto, se você deseja excluir todos esses itens , você DELETE
/products?colour=red
. Ou, se você deseja excluir alguns dos produtos por meio deid
, DELETE/products?id=1&id=2&id=3
.E a criação em massa de recursos? POSTAR sua coleção
[{...},{...},{...}]
simplesmente para/products
. O mesmo vale para PUT e PATCH .Isso é realmente simples.
Para responder suas perguntas:
Não é apenas OK, você é incentivado a fazer assim.
Está tudo bem. Como Eneko Alonso escreveu, algumas vezes existem operações em massa encapsuladas por pontos de extremidade "controlador", ou seja, um POST é usado para acionar operações (complexas).
fonte
PATCH
e uma substituição completa viaPUT
.Geralmente, os métodos REST têm a intenção de operar em uma única entidade / objeto (CRUD).
Existem várias opções:
O primeiro segue os padrões REST, mas pode ser caro, pois os objetos / entidades da coleção podem ser muito grandes (atualizar um grupo que possui milhares de produtos apenas para adicionar / remover um produto seria uma solicitação pesada).
A segunda opção é preferida por muitas APIs, como uma maneira de estender o REST além das operações CRUD.
Por exemplo:
Muitas APIs sempre usam POST para essas operações estendidas, mas nada limita o uso de outros métodos http (além do limite de GET e DELETE para ter um corpo vazio)
fonte
products/collection
retornando um 'envelope' de itens e o conteúdo do envelope alterado por meio de um PUT? Como "aqui está exatamente como eu quero que os itens da coleção sejam".Apenas para obter respostas / comentários anteriores precisos.
De acordo com meu conhecimento, POST é o método para adicionar elementos únicos à coleção.
DELETE, por sua vez, é o método para excluir um único elemento da coleção. Ambos os cenários são perfeitamente RESTful.
No entanto, você deve usar o URI apropriado para se referir a um único elemento ou a coleção inteira.
Por exemplo, para adicionar elemento à coleção, você deve POST dados para o seguinte URI:
Para excluir um único produto da coleção, você pode usar o método DELETE enviando solicitação para algo como:
O método PATCH pode ser usado para atualizar alguns elementos da coleção. Por exemplo, quando você só precisa atualizar um campo em um elemento. COLOCAR uma representação completa de recursos para uma coleção muito grande pode ser uma operação muito cara.
fonte
Em princípio, todas as operações RESTful são válidas em uma coleção, mas certifique-se de entender como a semântica dos verbos se aplica a uma coleção:
PUT é uma substituição completa .
/item/{id}
) e deixar dename
fora, ele deve ser limpo ou definido como nulo ou algo semelhante.Enquanto um PUT pode ser usado para adicionar itens, você deve enviar "todos" itens. O envio de "alguns" itens deve resultar em remoções (presumo que não seja isso que o OP deseja).
DELETE é mais intuitivo. É válido excluir a coleção ou qualquer subconjunto filtrado. Somente os itens incluídos no filtro devem ser afetados.
PATCH também é válido. Em teoria, você deve fornecer uma lista de "operações". Por exemplo, você deve tecnicamente enviar algo como:
Na prática, é mais comum ver uma API que aceita uma lista parcial de objetos em que cada item é processado usando uma lógica UPSERT (atualizar ou inserir).
Tecnicamente, o POST deve processar a entrada "de acordo com a semântica específica do próprio recurso".
{resource}/activate
.NOTA: Ao usar operações não-GET em coleções, considere cuidadosamente a definição de sucesso e falha. O REST não fornece uma boa maneira de comunicar sucesso parcial. Um bom padrão é supor que você executará a operação em uma transação com um critério de sucesso de tudo ou nada. Se não é isso que você deseja, provavelmente não deve interagir diretamente com a coleção.
fonte