Non c'è motivo per cui tu non possa fare nessuno dei due; o entrambi.
In un contesto di vendita, il monitoraggio delle singole transazioni ha molto senso. Lì, la soluzione di Robert ha molto senso.
In un contesto magazzino / magazzino, non è necessario tenere traccia delle transazioni tanto quanto "fare l'inventario"; con un endpoint che consente al client di segnalare i livelli di scorte
I have 10 units
I have 7 units
I have 3 units
I have 20 units
ha molto senso.
I livelli delle scorte cambiano per ragioni diverse dalle "vendite"; solo qualcosa da tenere a mente.
In teoria, il livello delle scorte dovrebbe essere calcolabile dai cambiamenti; ma in alcuni domini è proprio l'assunto che tu vuoi verificare . Dovresti essere in grado di calcolare il livello del grezzo in due modi diversi e controllare le discrepanze (ovvero "restringimento").
Quindi non penso che la semantica sia chiara, in base al contesto che hai fornito.
Come per la parte HTTP; PUT [target-uri]
ha senso semanticamente quando si sostituisce una rappresentazione di un documento con un'altra. È un UPSERT
- il secondo PUT a una risorsa chiede di sovrascrivere la rappresentazione esistente.
PUT /sales { Quantity = 5 }
PUT /sales { Quantity = 2 }
PUT /sales { Quantity = 3 }
indica che la quantità di unità vendute è 3
, non 10
.
PUT /sales/1 { Quantity = 5 }
PUT /sales/2 { Quantity = 2 }
PUT /sales/3 { Quantity = 3 }
Ecco come 10
assomiglia a
PUT /sales { Quantity : [5] }
PUT /sales { Quantity : [5,2] }
PUT /sales { Quantity : [5,2,3] }
Questo è un altro modo di ortografare 10
.
POST /sales { Quantity = 5 }
POST /sales { Quantity = 2 }
POST /sales { Quantity = 3 }
Per quanto riguarda HTTP, anche questo è accettabile. Tuttavia, non è una grande scelta su una rete inaffidabile perché i messaggi a volte duplicato.
POST /sales { Quantity = 5 }
POST /sales { Quantity = 2 }
POST /sales { Quantity = 3 }
POST /sales { Quantity = 3 }
È questo 13
? o 10
?
PUT /sales/1 { Quantity = 5 }
PUT /sales/2 { Quantity = 2 }
PUT /sales/3 { Quantity = 3 }
PUT /sales/3 { Quantity = 3 }
Questo è univocamente 10
PUT /sales { Quantity : [5,2,3] }
PUT /sales { Quantity : [5,2,3] }
Questo è univocamente 10
PUT /sales/1 { Quantity = 5 }
PUT /sales/2 { Quantity = 2 }
PUT /sales/3 { Quantity = 3 }
PUT /sales/4 { Quantity = 3 }
Questo è inequivocabilmente 13
PUT /sales { Quantity : [5,2,3] }
PUT /sales { Quantity : [5,2,3,3] }
Questo è inequivocabilmente 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
(Per essere onesti, HTTP ha il supporto per richieste condizionali ; puoi rimuovere alcuni dei metadati dal tuo dominio protocollo specifico nelle intestazioni agnostiche del dominio per eliminare alcune delle ambiguità - se riesci a convincere il cliente a giocare insieme.
Naturalmente, ci sono trade off: l'HTML non ha il supporto PUT nativo; se intendi che i client della tua API siano browser, allora hai bisogno di un protocollo basato su POST o hai bisogno di estensioni code-on-demand per convertire l'invio di moduli da un POST a un PUT.