2009-12-02 11 views
71

Sto utilizzando RESTlet e ho creato una risorsa. Gestisco POST sovrascrivendo il metodo acceptRepresentation.Va bene da REST per restituire il contenuto dopo il POST?

Il client deve inviarmi alcuni dati, quindi lo memorizzo in DB, impostare la risposta su 201 (SUCCESS_CREATED) e ho bisogno di restituire alcuni dati al client, ma restituire il tipo di acceptRepresentation è nullo.

Nel mio caso ho bisogno di tornare un identificatore in modo che il cliente può accedere a tale risorsa.

Per esempio, se ho avuto una risorsa con URL/risorsa e client invia richiesta POST aggiungo nuova riga nel DB e il suo indirizzo deve essere/risorse/{id}. Devo inviare {id}.

Sto facendo qualcosa di sbagliato? I principi REST consentono di restituire qualcosa dopo il POST? Se sì, come posso farlo, e se no, qual è il modo di gestire questa situazione?

+0

Sede di Thom per come impostare il corpo risposta dall'interno acceptRepresentation(). –

risposta

76

REST dice solo che si dovrebbe conformarsi al un'interfaccia uniforme. In altre parole, dice che dovresti fare ciò che il POST dovrebbe fare come per lo HTTP spec. Ecco la citazione di quella specifica che è rilevante,

Se una risorsa è stata creata sul server provenienza, la risposta dovrebbe essere 201 (Creato) e contengono un soggetto che descrive lo stato del richiesta e fa riferimento alla nuova risorsa e all'intestazione di posizione (vedere la sezione 14.30).

Come puoi vedere da questo, hai due posti in cui puoi indicare al cliente dove risiede la risorsa appena creata. L'intestazione Location dovrebbe avere un URL che punta alla nuova risorsa e puoi anche restituire un'entità con i dettagli.

Non sono sicuro di quale sia la differenza tra l'overriding di acceptRepresentation() e l'overriding post() ma l'esempio this mostra come restituire una risposta da un POST.

+1

@ del ragazzo: Si veda la risposta di Thom per come impostare il corpo risposta dall'interno acceptRepresentation(). –

+0

La citazione specifiche HTTP non vieta una risposta, se si guarda nella sezione 6 è chiaro su questo: è permesso: 'Request e Response messaggi possono trasferire un'entità se non altrimenti limitato da metodo di richiesta o il codice di stato della risposta. Un'entità è costituito da campi di entità-header e un'entità-corpo, anche se alcune risposte comprenderanno solo l'entità-headers.' – MikeF

+0

@MikeF Non era mia intenzione di dedurre che un corpo di risposta non era consentito. La parte della specifica che ho citato dice espressamente "e contiene un'entità". Avrei dovuto essere più chiaro nel mio testo. –

4

uscita in tutto ciò che è richiesto in formato. Che potrebbe essere:

<success> 
    <id>5483</id> 
</success> 

Oppure:

{ "type": "success", "id": 5483 } 

Dipende da quello che fai di solito. Se non si aspettano i dati, dovrebbero semplicemente ignorarlo, ma qualsiasi client che voglia gestirlo correttamente dovrebbe essere in grado di farlo.

+0

Ok, ho due possibili formati (html e xml). So come gestire il tipo di formato richiesto, ma non so come aggiungere dati alla risposta. rappresentano metodo restituisce Rappresentazione, quindi ho solo tornare quello che mai che voglio, ma acceptRepresentation è il metodo vuoto, quindi non posso tornare tutti i dati ... –

9

Due diverse domande:

supporta il modello di applicazione REST la restituzione dei dati in un post?

Non penso che REST lo neghi esplicitamente, ma il trattamento preferito è spiegato nella risposta di Darrel.

Vuol quadro Restlet consentire la restituzione dei dati in un post?

Sì, anche se restituisce void, in una classe che estende Risorsa, si ha accesso completo all'oggetto oggetto Risposta tramite il metodo getResponse(). Quindi puoi chiamare getResponse(). SetEntity() con qualsiasi dato tu voglia.

1

Se si risponde 201 Creato con un corpo di entità, piuttosto che un reindirizzamento di posizione, allora è una buona idea includere un'intestazione Content-Location che punta alla risorsa che viene rappresentata nella risposta.

Ciò eviterà la potenziale confusione - in cui un cliente potrebbe (giustamente) presumere che l'entità di risposta rappresenti effettivamente un nuovo stato del "creatore" e non la risorsa creata.

> POST /collection 
> ..new item.. 

< 201 Created 
< Location: /collection/1354 
< Content-Location: /collection/1354 
< <div class="item">This is the new item that was created</div> 
+3

Penso che Content-Location sia per uno scopo diverso. Le specifiche HTTP indicano che Content-Location non è definito per POST e PUT. L'intestazione Location viene utilizzata con 201-Create. Restituzione di una posizione non esegue automaticamente un reindirizzamento, è necessario un codice di risposta 3XX per quello. –

+1

L'intestazione posizione viene utilizzata (in una risposta 201) per indicare dove si trova la risorsa creata; non è rilevante per il corpo dell'entità della risposta che accompagna. Il punto è che, se si desidera includere la risorsa creata nella risposta 201 stessa (anziché dirigere/reindirizzare il client a un altro URI), un'intestazione di posizione del contenuto sarebbe una buona idea. Questo probabilmente sta "piegando le regole" un po ', ma è più efficiente di richiedere un altro ciclo di richiesta/risposta per ottenere lo stato della nuova risorsa sul client. – Mike

+0

Ha senso per me. Non ho mai usato l'intestazione Content-Location prima. –

11

Non rinuncerei a inviare nulla nel corpo della risposta. Basta impostare la posizione: all'URL (completo) della risorsa appena creata.

tua descrizione suggerisce che questo è esattamente la semantica voi:

  1. POST una cosa per crearlo
  2. Rispondere con abbastanza per sapere due cose:
    1. che la creazione è accaduto (la 201
    2. Dove trovare la nuova cosa (l'intestazione di posizione)

Tutto il resto è superfluo. risposta

+0

Non che Wikipedia sia sempre una buona fonte, ma [che] (https://en.wikipedia.org/wiki/HTTP_location) afferma anche _ "[...] Fornire informazioni sulla posizione di una risorsa appena creata. In questa circostanza, l'intestazione Location deve essere inviata con un codice di stato HTTP 201 o 202. "_ – Arjan

+0

POST può eseguire la logica che crea una o più risorse.Il risultato dell'elaborazione può essere necessario per il client. nella risposta evita la necessità di effettuare una o più chiamate GET all'API. I dati creati/modificati dal metodo POST potrebbero non essere (e spesso non lo sono) superflui per il client. –

Problemi correlati