Opzioni per l'approccio RESTFul per seguire e non seguire

3

Sto cercando di implementare una nuova chiamata RESTFul in cui un utente può seguire / non seguire un elemento generico "cosa", ma io bisogno di conoscere l'approccio migliore o comune di seguito, 1 o 2?

1) A OTTIENI o POST sul seguente URL:

user/{thing_to_follow_id)/follow
user/{thing_to_follow_id)/unfollow

O

2) Un POST contenente thing_to_follow_id

POST
user/follow

A DELETE su

user/follow/{thing_to_follow_id}

Il primo sembra il più riposante, ma è sbagliato pubblicare un payload vuoto in cui il secondo mi consente di fare un GET e restituire tutte le cose che un utente sta seguendo.

Qual è l'approccio migliore qui?

    
posta MrKnotts 09.01.2017 - 11:05
fonte

3 risposte

4

In base alla specifica HTTP , le chiamate di GET devono essere sicuro - cioè,

the client does not request, and does not expect, any state change on the origin server as a result of applying a safe method to a target resource

Inoltre, uno dei principi di REST è che gli URI puntano a cose (nomi), piuttosto che a azioni (verbi). Nel tuo caso, l'utente avrebbe una collezione di cose che seguono. Potrebbe essere più simile a:

add a new thing to the collection of things the user follows
POST /user/follows 
{
    thing
}

get all the things the user follows
GET /user/follows

stop following a thing
DELETE /user/follows/{id}

Un'altra opzione sarebbe quella di utilizzare una risorsa di mappatura, come ad esempio:

add a new thing to the collection of things the user follows
POST /user-follows
{
    user
    thing
 }

 get all the things the user follows
 GET /user-follows?userId={id}

 get all the users following a thing
 GET /user-follows?thingId={id}

 stop following a thing
 DELETE /user-follows/{id}
 DELETE /user-follows?thingId={id}&userId={id}
    
risposta data 09.01.2017 - 15:40
fonte
1

Puoi pensare al mapping tra un utente e una cosa da seguire come una risorsa unica in sé, che può avere due stati diversi, sia vero che falso a seconda che l'utente stia seguendo la cosa in questione.

Quindi un modo per farlo sarebbe che il client inserisse un nuovo stato di quella risorsa sul server, poiché il client dovrebbe già conoscere la posizione della risorsa. Lo schema dell'URL potrebbe essere qualcosa di simile a

/users/<user_id>/things/<thing_id>

o qualcosa di simile che trasmette che questa è una risorsa che rappresenta lo stato della mappatura tra utente e cosa.

Un GET su questa risorsa ti dirà se l'utente A sta seguendo la Cosa B

Request
  GET /users/<user_id>/things/<thing_id>

Response
  200 OK
  {following: true}

E il cliente può cambiare lo stato di PUT in un nuovo stato

Request
  PUT  /users/<user_id>/things/<thing_id>

  {following: false}

Response
  204 No Content
    
risposta data 09.01.2017 - 16:16
fonte
0

Poiché in pratica stai aggiornando / creando qualche riga in una tabella quando un utente decide di seguire o smettere di seguire un articolo, non dovresti utilizzare GET.

Piuttosto utente POST o PUT

POST or PUT:
user/{thing_to_follow_id)/follow

PUT:
user/{thing_to_follow_id)/unfollow

E a meno che tu non stia effettivamente eliminando qualcosa (se qualcun altro può in seguito scegliere di seguire quell'elemento), allora non usare un DELETE.

    
risposta data 09.01.2017 - 15:38
fonte

Leggi altre domande sui tag