Suggerirei di utilizzare POST, non PUT, per una chiave di incremento automatico o non utilizzare la chiave di incremento automatico nell'ID risorsa.
Se si utilizza il POST, quindi si POST a /users
anziché a /users/1
. La risposta potrebbe reindirizzare a /users/1
o qualunque sia l'ID.
Se si utilizza PUT, è possibile immettere su /users/10292829
dove il numero è una chiave risorsa univoca generata sul client. Questa chiave può essere generata nel tempo, oppure può essere un hash di tempo, ID di sessione e altri fattori per garantire l'unicità del valore nel pubblico del cliente. Il server può quindi generare il proprio indice autoincrementato, distinto da 10292829
o qualsiasi altra cosa.
Per ulteriori informazioni su questo, vedere PUT vs POST in REST
In seguito. . .
Nel caso di consentire PUT a/users/XXXXXXX, per tutti gli utenti, ci si ritroverà con due chiavi uniche distinte che fanno riferimento alla stessa risorsa. (10292829 e 1 potrebbero riferirsi allo stesso utente). Dovresti decidere come consentire l'uso di ciascuna di queste chiavi diverse in un URL in stile REST. A causa della necessità di riconciliare l'uso di questi due ID distinti, preferirei utilizzare la prima opzione, POSTing a /users
e ottenere un URL REST univoco della risorsa creata nella risposta.
Ho appena riletto the relevant section of RFC 2616, e ho visto un codice di ritorno appositamente progettato per questo nelle applicazioni REST:
10.2.2 201 Creato
La richiesta è stata soddisfatta e ha provocato una nuova risorsa in fase di creazione. La risorsa appena creata può essere referenziata dagli URI restituiti nell'entità della risposta, con l'URI più specifico per la risorsa fornita da un campo dell'intestazione di posizione. La risposta DOVREBBE includere un'entità che contiene un elenco di caratteristiche di risorse e ubicazione (s) da cui l'utente o utente agente può scegliere quello più appropriato. Il formato dell'entità è specificato dal tipo di media indicato nel campo dell'intestazione Content-Type.Il server di origine DEVE creare la risorsa prima di restituire il codice di stato 201. Se l'azione non può essere eseguita immediatamente, il server DOVREBBE rispondere con una risposta 202 (accettata).
Quindi, il modo RESTful per andare è nella quale inserire l'/users
e restituire un 201 Created
, con un colpo di testa Location:
specificando /users/1
.
Attualmente l'API REST supporta il POST ma desidero anche supportare PUT per consentire gli aggiornamenti. Quindi, per evitare la complicazione di passare ID univoci dal lato client, PUT dovrebbe semplicemente restituire un 404 se la risorsa non esiste piuttosto che tentare di crearla? Questo sarebbe ancora considerato RESTful? – James
Sì, 'PUT' è progettato per gli aggiornamenti. Se l'URI a cui viene inviato il PUT non si riferisce a una risorsa disponibile, allora un 404 è una cosa ragionevole da restituire. Se si tratta di REST/JSON, è possibile includere un messaggio di errore in formato json nel corpo del messaggio della risposta. '{" errore ":" la risorsa non esiste. "}'. Ma in realtà, l'invio di informazioni nel corpo del messaggio è appropriato solo se aggiunge alle informazioni che il codice di stato trasmette. Se "Non esiste" è il messaggio, allora 404 è sufficiente e nessun corpo del messaggio è necessario. – Cheeso
Cool, quindi con 'PUT' hai la possibilità di scegliere se vuoi creare o meno (che è quello che cercavo davvero per chiarimenti). Pensando nel mio scenario, allora 'PUT' sarà usato per l'aggiornamento (se la risorsa esiste). Grazie! – James