2013-05-08 17 views
7

Sto progettando una semplice API CRUD REST. Questa è la mia prima volta, quindi volevo avere un riscontro sul fatto che il mio progetto avesse un senso.Come progettare una semplice API CRUD REST

Sto utilizzando i metodi HTTP: GET, POST, DELETE e UPDATE. L'API consumerà e recupererà i dati in formato JSON. L'URL campione sarà come questo:

GET (list): curl http://<domain>/myapp/rest/v1/colors 
POST: curl -XPOST http://<domain>/myapp/rest/v1/colors -d '{ 
     "name": "red", 
     "shade": "light" 
     }' 
GET (single item): curl http://<domain>/myapp/rest/v1/colors/2 
DELETE: curl -XDELETE http://<domain>/myapp/rest/v1/colors/2 
etc... 

Domanda

Dopo la richiesta POST un record verrà creato nel database. Quindi, la richiesta POST dovrebbe restituire l'ID del record appena creato? In modo che l'ID può essere utilizzato in UPDATE, DELETE and GET (single item)?

+0

Dipende da come è stato progettato il servizio di riposo. Ya, una richiesta POST può ricevere il corpo della risposta. – Joshi

+0

Grazie, sì, capisco che un POST può ricevere un corpo. Ma posso inviare una risposta dopo che la richiesta è stata elaborata e dire, ad esempio, che il record appena creato ha un ID di '659' – birdy

+0

Sì, puoi usare quegli id ​​se sono sincronizzati con il tuo database. – Joshi

risposta

5

Il HTTP specification definisce quanto segue POST:

Se una risorsa è stata creata sul server di origine, la risposta dovrebbe essere 201 (Opera) e contengono un'entità che descrive lo stato della richiesta e si riferisce alla nuova risorsa e un'intestazione di posizione (vedere la sezione 14.30).

Quindi questo significa essenzialmente:

  • Si dovrebbe tornare 201 Created come codice di stato
  • Si dovrebbe restituire un colpo di testa Location, indicando l'URI della risorsa appena creata
  • Si può opzionalmente includere una rappresentazione della risorsa nell'entità di risposta POST per liberare il client dall'emissione di un'altra richiesta GET rispetto al valore ottenuto dall'intestazione Location.
+0

nice. in modo che il terzo punto indica che posso semplicemente restituire l'ID appena creato – birdy

+4

No. Innanzitutto, l'URI * è * l'ID (da cui il nome). Secondo, ho scritto "una rappresentazione della risorsa", questo significa che è essenzialmente lo stesso che avresti ottenuto se avessi seguito il link nell'intestazione 'Location', leggi: il JSON che hai originariamente inviato nel tuo caso. –

1

Il POST deve restituire un nuovo reindirizzamento al nuovo URL per il singolo elemento.

Probabilmente si desidera perdere l'identificatore di versione degli URL.

Invece progettare le rappresentazioni e i client in un modo che gestisce con garbo varie versioni. Ad esempio, un client non dovrebbe dipendere da un formato specifico, ma solo dagli attributi di cui ha effettivamente bisogno.

Ciò che manca nella descrizione è il principio HATEOAS, ovvero il client non deve codificare gli URL, ma trovare gli URL per ulteriori azioni all'interno della rappresentazione di altre entità. Dato che non mostri un documento di esempio per i risultati restituiti dagli URL, non possiamo dire se lo hai fatto in un modo carino.

Partenza this presentation, spiega l'argomento e anche cita alcuni Primavera Biblioteca utile per la sua attuazione.

+0

Grazie, non ero a conoscenza del principio HATEOAS.btw anche se mancano i tag sto usando grails per realizzare questo. Aggiungerò il tag. Pertanto, anziché restituire solo l'ID, il post dovrebbe restituire un URL completo per il singolo elemento, ad esempio "http: // /myapp/rest/v1/colors/2" – birdy