Não há razão para que você também não possa fazer; ou ambos.
Em um contexto de ponto de venda, o rastreamento de transações individuais faz muito sentido. Lá, a solução de Robert faz muito sentido.
No contexto de estoque / armazém, você não controla necessariamente as transações, mas "faz o inventário"; ter um terminal que permita ao cliente relatar seus níveis de estoque
Tenho 10 unidades tenho 7 unidades tenho 3 unidades tenho 20 unidades
faz muito sentido.
Os níveis de estoque mudam por outros motivos que não "vendas"; Apenas algo para ter em mente.
Em teoria, o nível de estoque deve ser computável a partir das mudanças; mas em alguns domínios, essa é precisamente a suposição que você deseja verificar . Você deseja calcular o nível de estoque de duas maneiras diferentes e verificar discrepâncias (também conhecido como "encolhimento").
Portanto, não acho que a semântica seja clara, com base no contexto que você forneceu.
Quanto à parte HTTP; PUT [target-uri]
faz sentido semanticamente quando você está substituindo uma representação de um documento por outra. É um UPSERT
- o segundo PUT para um recurso está pedindo para substituir a representação existente.
PUT /sales { Quantity = 5 }
PUT /sales { Quantity = 2 }
PUT /sales { Quantity = 3 }
diz que a quantidade de unidades vendidas 3
não é 10
.
PUT /sales/1 { Quantity = 5 }
PUT /sales/2 { Quantity = 2 }
PUT /sales/3 { Quantity = 3 }
É assim que 10
parece
PUT /sales { Quantity : [5] }
PUT /sales { Quantity : [5,2] }
PUT /sales { Quantity : [5,2,3] }
Essa é outra maneira de ortografia 10
.
POST /sales { Quantity = 5 }
POST /sales { Quantity = 2 }
POST /sales { Quantity = 3 }
No que diz respeito ao HTTP, isso também é aceitável. No entanto, não é uma ótima opção em uma rede não confiável porque as mensagens às vezes são duplicadas.
POST /sales { Quantity = 5 }
POST /sales { Quantity = 2 }
POST /sales { Quantity = 3 }
POST /sales { Quantity = 3 }
É isso 13
? ou 10
?
PUT /sales/1 { Quantity = 5 }
PUT /sales/2 { Quantity = 2 }
PUT /sales/3 { Quantity = 3 }
PUT /sales/3 { Quantity = 3 }
Isso é inequivocamente 10
PUT /sales { Quantity : [5,2,3] }
PUT /sales { Quantity : [5,2,3] }
Isso é inequivocamente 10
PUT /sales/1 { Quantity = 5 }
PUT /sales/2 { Quantity = 2 }
PUT /sales/3 { Quantity = 3 }
PUT /sales/4 { Quantity = 3 }
Isso é inequivocamente 13
PUT /sales { Quantity : [5,2,3] }
PUT /sales { Quantity : [5,2,3,3] }
Isso é inequivocamente 13
POST /sales { TransactionId = 1 , Quantity = 5 }
POST /sales { TransactionId = 2 , Quantity = 2 }
POST /sales { TransactionId = 3 , Quantity = 3 }
POST /sales { TransactionId = 3 , Quantity = 3 }
10
POST /sales { TransactionId = 1 , Quantity = 5 }
POST /sales { TransactionId = 2 , Quantity = 2 }
POST /sales { TransactionId = 3 , Quantity = 3 }
POST /sales { TransactionId = 4 , Quantity = 3 }
13
(Para ser justo, o HTTP tem suporte para solicitações condicionais ; você pode elevar alguns dos metadados do protocolo específico do domínio para os cabeçalhos agnósticos do domínio para eliminar parte da ambiguidade - se conseguir convencer o cliente a seguir adiante).
Obviamente, existem trocas - o HTML não tem suporte nativo a PUT; se você pretende que os clientes da sua API sejam navegadores, é necessário um protocolo baseado no POST ou extensões de código sob demanda para converter o envio do formulário de um POST para um PUT.