Considerate queste applicazioni REST API / HATEOAS:
... dove le risorse POST / PUT / PATCHING alterano chiaramente lo stato / disponibilità di (altre) risorse - ad esempio in:
-
(REST example API 1)
PUT /order/1234 HTTP/1.1 ... <order> ... <status>preparing</status> ... </order>
... altera lo stato dell'ordine, in modo tale che alcune opzioni di ordine non siano più disponibili;
-
(REST example API 2)
PUT /games/1/doors/3 HTTP/1.1 ... {"status": "OPEN"}
... altera lo stato del gioco, in modo tale che alcune opzioni di gioco non sono più disponibili
- cosa sarebbe sbagliato trattando una sessione client come uno stato di risorsa / di un'applicazione?
Considera questo esempio, per vedere cosa intendo:
Let's imagine API key
1234
is the owner of/products/1
and only this API key is allowed to operate on/view this product.
Richiesta:
GET /products/1 HTTP/1.1
Risposta:
HTTP/1.1 403 Forbidden
Richiesta:
POST /sessions HTTP/1.1
Authorization: NiceAPI apikey=1234
<session>
<apiKey>1234</apiKey>
</session>
Risposta:
HTTP/1.1 201 Created
Location: /sessions/2ef4c...
// created session sent along for convenience
<session>
<hash>2ef4c...</hash>
<apiKey>1234</apiKey>
</session>
In risposta a commento di Richard Tingle , la risposta sopra potrebbe essere regolata per inviare un cookie, invece dell'hash nella rappresentazione della risorsa della sessione:
HTTP/1.1 201 Created
Set-Cookie: session=2ef4c...; Secure; HttpOnly
Location: /sessions/2ef4c...
<session>
<hash>2ef4c...</hash> // not necessary/desirable anymore
<apiKey>1234</apiKey>
</session>
... per associare la risorsa di sessione a un client
Richiesta:
GET /products/1 HTTP/1.1
X-Session: 2ef4c... // or a Cookie header, etc.
Risposta: (se esiste una risorsa di sessione verificata dal server)
HTTP/1.1 200 OK
// product content
Richiesta:
DELETE /sessions/2ef4c... HTTP/1.1
Authorization: NiceAPI apikey=1234
Risposta: (se la sessione verificata dal server apparteneva alla chiave API)
HTTP/1.1 204 No Content
// session resource successfully deleted
Richiesta:
GET /products/1 HTTP/1.1
Risposta:
HTTP/1.1 403 Forbidden
Voglio dire, in entrambe le applicazioni REST API / HATEOAS menzionate in precedenza le operazioni valide per qualsiasi particolare risorsa dipendevano anche da altri stati di risorsa e / o azioni client precedenti (ad esempio è parte della logica dell'applicazione).
Dato che la gestione dello stato del client / sessione è generalmente disapprovata quando si parla di REST, in che modo le API REST / HATEOAS citate in precedenza dichiarano diversamente dalla mia sessione proposta come stato di risorsa / applicazione?