Sto provando a racchiudere un'API RESTful attorno a un'implementazione esistente di un gioco.
Ecco un possibile diagramma di stato di un semplice design API che viene in mente:
Ho problemi qui perché l'implementazione del dominio esistente non espone un elenco di mosse. Invece espone lo stato dell'intero consiglio. Non è necessaria una lista di mosse perché il gioco non supporta le maiuscole, né i replay dei giochi ecc.
Posso pensare ad alcune opzioni:
-
Eseguo il drill sull'implementazione del dominio esistente e visualizziamo un elenco di mosse per ogni gioco. In modo che io possa implementare il design dal diagramma sopra.
Non mi piace perché dover modificare il modello di dominio esistente solo per calzare il cursore su un'API ha un cattivo odore.
-
Progetto una transizione di stato da
/api/games/{id}
con la relazione di estensionenewMove
(o sth. simile) che consente unPOST
sulla risorsa/api/games/{id}/moves
. Fornirò un documento API sotto/docs/rels/newMove
. Non ci sarà un'implementazione perGET
nella lista delle mosse.Questo è ancora RESTful? Ogni risorsa RESTful deve avere una rappresentazione e consentire
GET
?Trovo questo interessante, però, perché significa quasi nessuna logica lato server aggiuntiva.
-
Naturalmente ci sono più opzioni. Potrei progettare la scheda come una sotto risorsa e implementare una transizione di stato
PUT
(+ link relation e docs) per aggiornarla.Non mi piace neanche questo. Significa che devo trasferire l'intera board, inclusa la nuova mossa. Mettendo l'intera scheda sul server e facendo in modo che il server lo rilevasse, quale campo è cambiato e convalida anche che solo un campo è cambiato, e cosa no, è inutilmente complesso. E risulterebbe in una certa quantità di logica aggiuntiva sul server. Che di nuovo ha un cattivo odore. Quindi forse
PATCH
invece? -
Finalmente ho potuto progettare la scheda come una sotto risorsa e ogni campo della scheda come una sotto-risorsa della scheda (ad esempio
/api/games/{id}/board/5/11
) e quindi implementare unPUT
per effettuare la mossa.Questo non sembra male. Ma sarebbe stupido avere il client che ottiene lo stato della scheda facendogli fare più richieste per ottenere lo stato di ogni campo. Quindi ci dovrebbe probabilmente essere una rappresentazione della scheda completa da qualche parte (ad esempio
/api/games/{id}/board
o come valore del gioco stesso). In questo caso la domanda sorge spontanea se ha senso implementareGET
per ogni campo del board, perché non ne avrai bisogno.Quindi, di nuovo qui, ogni risorsa RESTful deve avere una rappresentazione?
Qual è la soluzione più semplice che aderisce ancora ai vincoli REST?
Una delle opzioni sopra o forse qualcosa di completamente diverso?