Questo pattern è RESTful? O qualcos'altro?

0

Sto lavorando a un nuovo progetto che creerà un'API basata sul Web per eseguire operazioni CRUD su un database relazionale.

In origine, stavo per creare l'API come http e renderla RESTful in modo che, ad esempio, le operazioni su un record personale potessero apparire come:

PUT /api/person/create/Sally/Smith/[email protected]

o

GET /api/person/findByEmail/[email protected]

Per creare e leggere.

Tuttavia, da allora ho sostituito lo strato http (nodo / espresso) per un layer http / websockets (node / express.io). Ho creato percorsi in tempo reale in modo che ora, una volta che un client ha una connessione socket aperta, possano eseguire le stesse azioni di cui sopra con:

socket.emit('person:create', {firstname: 'Sally', lastname: 'Smith', email: '[email protected]'});

e

socket.emit('person:select', {email: '[email protected]'});

In un certo senso, questo tipo in qualche modo soddisfa i vincoli di REST (è client / server, è "apolide" in quanto nessuna richiesta si basa su una richiesta precedente, ecc.) ma è come chiamare questo modello "RESTful" è sbagliato.

È così? Se non è REST, che cos'è?

    
posta GojiraDeMonstah 23.02.2015 - 17:04
fonte

1 risposta

1

Ci sono alcune cose che rendono questa API non molto RESTful:

Gli URL dell'API REST identificano le risorse, non le azioni. In primo luogo, le azioni non devono far parte del percorso dell'URL. Le azioni sono i diversi metodi HTTP. Invece di fare qualcosa come GET /api/person/findByEmail/[email protected] , dovresti rimuovere findByEmail e utilizzare i parametri di ricerca per comunicare che stai cercando tramite email, ad es. %codice%. Notare che sono anche cambiato da persona a persone , poiché le raccolte dovrebbero generalmente essere indicate come plurali delle risorse che contengono. Questa risorsa viene visualizzata come "Persone che hanno l'indirizzo email [email protected]" e con il metodo GET la richiesta diventa "Ricevi le persone che hanno l'indirizzo email [email protected]".

In secondo luogo, PUT dovrebbe sempre essere idempotente, e il modo in cui lo stai usando non lo è. In altre parole, se il metodo PUT viene chiamato accidentalmente più volte di quanto previsto, non avrà molta importanza.

Quando utilizzare PUT: quando posiziona una risorsa in una posizione specifica, ad es. se vuoi mettere una risorsa canzone a GET /api/[email protected] . Se questo viene chiamato più di una volta, non avrà un risultato diverso. Nota, posizionare qualcosa potrebbe anche significare mettere qualcosa che non era precedentemente nel sistema. PUT può creare una risorsa sul back-end o nel livello di persistenza da qualche parte se non esiste già prima di collocarlo nella posizione specificata. Il punto chiave qui è che non stai dicendo 'crea un utente e dammi un URL per fare riferimento a tale utente', stai dicendo 'crea un utente simile a questo e metti l'utente a questo URL'. Questa richiesta potrebbe essere "Metti la canzone seguente come prima traccia nella playlist 5"

Quando usare POST: quando crea una risorsa, e tocca al server creare un URL per la risorsa. Un esempio potrebbe essere la creazione di un utente, proprio come si sta tentando di fare, che potrebbe essere fatto in questo modo: /api/playlists/5/tracks/1 . Un altro modo per farlo sarebbe semplicemente utilizzare POST /api/people?firstName=Sally&lastName=Smith&[email protected] e passare come corpo della richiesta un oggetto persona contenente tali dettagli, ad esempio:

{
    firstName: "Sally",
    lastName: "Smith",
    email: "[email protected]"
}

La risposta avrebbe un'intestazione POST /api/people che indica che la risorsa persona vive in quell'URL. Se lo chiami una seconda volta, potrebbe darti Location : api/people/1 . Ogni successivo POST dovrebbe darti un nuovo URL per la risorsa appena creata perché stai creando uno nuovo ogni volta che viene chiamato. Si noti che, per loro natura, le richieste POST sono generalmente non idempotenti.

Quindi qualunque cosa sia, non la chiamerei REST. Per quanto riguarda ciò che puoi chiamarlo, direi che dipende da te. Immagino che dovresti chiederti se conta davvero come lo chiami e se c'è qualcosa di sbagliato nel chiamarlo semplicemente una "websockets API".

    
risposta data 23.02.2015 - 18:30
fonte

Leggi altre domande sui tag