In generale hai un endpoint che rappresenta l'intera collezione di x :
/products
Di ', vuoi aggiornare un singolo prodotto, fai un PUT a /products/{id}
.
Se si desidera aggiornare parzialmente un singolo prodotto (non aggiornando tutti i campi), è possibile utilizzare anche un PATCH a /products/{id}
. Lo stesso vale per la cancellazione di una singola entità ( DELETE a /products/{id}
).
Se vuoi scegliere come target una risorsa singola , puoi qualificarti tramite path, che single ressource, che vuoi modificare.
L'unica azione che interrompe lo schema è la creazione di una risorsa. Quando crei una risorsa, scegli come target la raccolta nel suo complesso, ad esempio POST a /products
.
Detto questo, dovrebbe essere chiaro, che l'obiettivo per le operazioni che riguardano la raccolta nel suo complesso, dovrebbe andare al punto di raccolta appropriato.
es. vuoi recuperare un sottoinsieme di prodotti che sono rossi, lo chiedi con
OTTIENI a /products?colour=red
.
Quindi, se vuoi eliminare tutti questi elementi, DELETE /products?colour=red
. Oppure, se desideri eliminare alcuni prodotti tramite id
, potresti DELETE /products?id=1&id=2&id=3
.
Che dire della creazione di massa delle risorse? POST la tua collezione [{...},{...},{...}]
semplicemente a /products
. Lo stesso vale per PUT e PATCH .
È molto semplice.
Per rispondere alle tue domande:
If I need to add to the collection, is it OK that I pass only some products with PUT?
Non è solo OK, sei incoraggiato a farlo in quel modo.
If I need to delete some products from the collection, is it OK that I pass filter data (an array of ID's) with DELETE?
Va bene. Come scrisse Eneko Alonso, a volte ci sono bulkoperations incapsulate tramite "controllore" -endpoint, cioè un POST viene usato per attivare operazioni (complesse).