2013-01-11 14 views
5

Pensando in modo RESTful, è corretto utilizzare POST per creare in una singola chiamata una risorsa e la relativa sotto-risorsa? Nella mia applicazione ho la risorsa /notices/{notice} e la sotto-risorsa /notices/{notice}/photos/{photo}. Un {photo} non può esistere senza un {notice}, ma un {notice} non ha necessariamente foto. Normalmente, devo prima fare un POST per creare un avviso, poi un altro POST per aggiungere una foto.REST - Creazione di risorse annidate con singolo POST

Ora voglio consentire la creazione di un avviso con una foto direttamente allegata, consentendo la creazione di /notices/{notice} e /notices/{notice}/photos/{photo} con una singola richiesta POST a/avvisi/{notice}/foto/{foto}, con un contenuto multipart descrivendo entrambe le risorse (JSON per avviso, binario per la foto). Penso che restituirò l'intestazione Location solo per la sotto-risorsa.

In sostanza, voglio che questo impedisca ai client Android di inviare due richieste POST al server per caricare un avviso con una foto. È corretto? O viola i principi REST? Devo considerare di tenerli separati e fare due richieste diverse? O è sbagliato considerare le foto come entità separate dall'avviso? Devo conservare solo /notices/{notice} come risorsa, utilizzando PUT per aggiungere foto?

Qual è la soluzione migliore?

risposta

2

Sì, non c'è nulla di male nella creazione di sottocomponenti nello stesso momento in cui si crea la risorsa genitore. Sarebbe anche OK usare PUT invece di POST per fare ciò, poiché tutto sotto l'URL principale è parte di/appartiene alla risorsa che stai caricando.

EDIT:

Ora voglio per permettere la creazione di un avviso con una foto direttamente collegato, consentendo la creazione di /notices/{notice} e /notices/{notice}/photos/{photo} con un unico POST richiesta di /notices/{notice}/photos/{photo}

Questo non sono d'accordo con. Suggerisco il POST all'URL della risorsa della raccolta, /notices. Fornisci l'avviso e le sue foto come un'unica rappresentazione (corpo della richiesta). Il back-end quindi creerà risorse sia per l'avviso che per qualsiasi foto costituente.

+0

Sicuramente da quella logica, tutto dopo l'endpoint sarebbe una modifica della risorsa root e quindi rendere l'idea di 'POST' ridondante? (Forse ti ho frainteso?) – James

+0

In teoria, sì. Puoi pensare a/domande come sotto risorsa di stackoverflow.com. Ciò tuttavia non rende POST ridondante. –

+0

Direi che l'uso di 'POST' sarebbe l'unica opzione sensata qui in quanto l'OP non sta modificando la maggior parte delle risorse (direttamente)? Creare la risorsa con un 'PUT' implica che questa sotto-risorsa esiste già? – James

0

Sebbene sia essenziale in molti casi, più modifiche/creazioni non sono formalmente affrontate dallo stile di architettura RESTful.

Il problema inizia quando è necessario segnalare errori su parte della raccolta e il problema si aggrava quando i guasti hanno cause diverse.

A avrà effetto sulla scelta dei giusti comandi Hypermedia che sono essenziali per il cliente per trovare una via da seguire nella transazione/conversazione specificata.

quindi il mio suggerimento è di avere un ciclo nidificato o richieste POST piuttosto che un POST singolare per creare risorse annidate, in modo che sia più semplice e più chiaro indirizzare ogni modifica dello stato delle risorse.

+0

La soluzione è fallire al primo errore e ripristinare lo stato del server. Se l'implementazione di transazioni in questo modo vale lo sforzo dipende da quanto è occupato il server. –

+0

Si prega di visitare http://chat.stackoverflow.com/rooms/22578/restful-chat e discuterne. Mi piacerebbe sentire di più su quello che hai da dire. –

Problemi correlati