Ho un servizio lato server (utilizzando ASP.NET Core) che dovrebbe fornire un'API REST a vari client.
Dietro il servizio, utilizzo un server SQL per l'archiviazione dei dati.
Il controller ha il seguente attributo di percorso:
[Route("api/[controller]")]
[ApiController]
public class CustomDataController : ControllerBase
{…}
Esistono metodi di provider di dati:
[HttpGet(nameof(GetDataForGuest))]
public async Task<IQueryable<Specs>> GetDataForGuest(int skip, int take, Guid organizationID) => await dataProvider.GetDataAsync<Specs>(skip, take, organizationID);
Esistono metodi per creare o aggiornare dati sul server:
[HttpPost(nameof(SaveDataToServer))]
public async Task SaveDataToServer([FromBody] List<Specs> specs) => await dataProvider.SaveDataAsync<Specs>(specs, isNewData: true);
Secondo molti articoli (come questo ), GET
serve per restituire alcune risorse, POST
è per la creazione e PUT
è per l'aggiornamento:
- GET — For returning resources
- POST — For creating a new resource
- PUT — For updating a resource
- PATCH — For updating a resource
- DELETE — For deleting a resource
Tuttavia, come puoi vedere, i miei metodi sono solo facciate, i dati vengono salvati dal fornitore di dati e posso decidere in base a una variabile bool per inserire o aggiornare un record in entrata.
Come puoi anche intuire, non utilizzo gli URL REST tradizionali (come api/user/1
), poiché ho bisogno di dati complessi, quindi i miei URL sono simili a questo:
https://192.168.0.101:8080/api/customdata/GetDataForGuest?skip=0&take=10&organizationID=58b77372-abbc-435e-9a5b-d77bc05129c7
Al momento ottengo dati con HttpPost
sia per l'inserimento di nuovi record che per l'aggiornamento di quelli esistenti (e funziona normalmente). Le mie preoccupazioni riguardano le best practice: dovrei usare HttpPut
quando voglio aggiornare un record esistente?
Secondo le specifiche, l'utilizzo di PUT
è idempontent per definizione mentre POST
non lo è, quindi l'esecuzione della query non dovrebbe dipendere da quante volte è stata chiamata.
Sul lato client, utilizzo alcune query building (in base ai parametri) e chiamo il metodo con un'azione POST
:
public async Task SaveDataToServer(string methodName, List<T> data, bool isNewData)
{
var parameters = GetParameters(methodName, isNewData);
var baseUri = new Uri(baseUriString, methodName);
var targetUri = UriBuilding(baseUri, parameters).AbsoluteUri;
var result = await httpClient.PostAsync<List<T>>(targetUri, data);
}
Quindi utilizzare solo POST
è considerato una best practice? O dovrei separare le azioni di aggiornamento in un altro metodo contrassegnato con HttpPut
? Ha importanza considerando che la logica dietro i metodi decide cosa accadrà e non il verbo?