Ricorda che con un'API REST è tutta una questione di tuo punto di vista.
I due concetti chiave in un'API REST sono gli endpoint e le risorse (entità). In parole povere, un endpoint restituisce risorse tramite GET o accetta risorse tramite POST e PUT e così via (o una combinazione di quanto sopra).
Si accetta che con POST, i dati inviati possano o meno determinare la creazione di una nuova risorsa e dei suoi endpoint associati, che molto probabilmente non "risulteranno" sotto l'URL POST. In altre parole, quando POST invii dati da qualche parte per la gestione. L'endpoint POST non è dove normalmente è possibile trovare la risorsa.
Citando da RFC 2616 (con parti irrilevanti omesse e parti rilevanti evidenziate):
9.5 POST
Il metodo POST viene utilizzato per richiedere che il server di origine accetti l'entità racchiusa nella richiesta come nuovo subordinato della risorsa identificata dall'URI di richiesta nella riga di richiesta. POST è progettato per consentire un metodo uniforme per coprire le seguenti funzioni:
- ...
- Fornire un blocco di dati, come il risultato dell'invio di un modulo, a un processo di gestione dei dati;
- ...
...
L'azione eseguita dal metodo POST potrebbe non comportare una risorsa che può essere identificata da un URI . In questo caso, 200 (OK) o 204 (Nessun contenuto) è lo stato di risposta appropriato, a seconda che la risposta includa o meno un'entità che descrive il risultato .
Se una risorsa è stata creata sul server di origine, la risposta DOVREBBE essere 201 (Creata) ...
Ci siamo abituati agli endpoint e alle risorse che rappresentano "cose" o "dati", sia esso un utente, un messaggio, un libro, qualunque sia il dominio del problema. Tuttavia, un endpoint può anche esporre una diversa risorsa, ad esempio i risultati della ricerca.
Considera il seguente esempio:
GET /books?author=AUTHOR
POST /books
PUT /books/ID
DELETE /books/ID
Questo è un tipico CRUD RIPOSO. Tuttavia cosa succede se abbiamo aggiunto:
POST /books/search
{
"keywords": "...",
"yearRange": {"from": 1945, "to": 2003},
"genre": "..."
}
Non c'è nulla di non RESTOSO su questo endpoint. Accetta i dati (entità) nella forma del corpo della richiesta. Tali dati sono i criteri di ricerca - un DTO come un altro. Questo endpoint produce una risorsa (entità) in risposta alla richiesta: Risultati della ricerca . La risorsa dei risultati della ricerca è temporanea, servita immediatamente al client, senza reindirizzamento e senza essere esposta da qualche altro URL canonico.
È ancora REST, tranne per il fatto che le entità non sono libri: l'entità richiesta è un criterio di ricerca del libro e l'entità della risposta è un risultato di ricerca del libro.