2009-08-20 14 views
5

Diciamo che ho un servizio RESTful, basato su ipertesto, che modella una gelateria. Per aiutare a gestire meglio il mio negozio, voglio essere in grado di visualizzare un rapporto giornaliero che elenca la quantità e il valore in dollari di ogni tipo di gelato venduto.Rappresentazioni transitori REST

Sembra che questa funzionalità di reporting possa essere esposta come una risorsa denominata DailyReport. Un DailyReport può essere generato rapidamente e non sembra esserci alcun vantaggio per l'archiviazione dei report sul server. Voglio solo un DailyReport per alcuni giorni, altri giorni non mi interessa ottenere un DailyReport. Inoltre, la memorizzazione di DailyReports sul server complicherebbe le implementazioni dei client, che avrebbero bisogno di ricordare di cancellare i report di cui non hanno più bisogno.

Un DailyReport è temporaneo; la sua rappresentazione può essere recuperata solo una volta. Un modo per implementare questo sarebbe offrire un link "/ daily-reports", un POST a cui verrà restituita una risposta contenente una rappresentazione DailyReport che elenca le informazioni per le vendite di quel giorno.

Modifica: Diciamo anche che voglio davvero fare una richiesta POST. Un DailyReport ha molte opzioni diverse per creare una vista come ordinare i tipi di gelato in ordine alfabetico, in base al valore in dollari - o includere una ripartizione oraria - o facoltativamente includendo la temperatura per quel giorno - o filtrare determinati tipi di gelato (come elenco). Piuttosto che utilizzare i parametri di query con un GET, preferirei POST una rappresentazione DailyReport con le opzioni appropriate (utilizzando un tipo di supporto personalizzato ben definito per documentare ciascuna opzione). La rappresentazione che torno mostrerà le mie opzioni insieme al rapporto stesso.

È questo il modo corretto di pensare al problema oppure dovrebbe essere utilizzato un altro approccio? Se è corretto, quali considerazioni speciali potrebbero essere importanti quando si implementa la risorsa DailyReport? (Ad esempio, probabilmente non sarebbe appropriato impostare l'intestazione Location quando si torna dopo una richiesta POST).

risposta

4

Se si desidera rendere disponibili report giornalieri per i giorni passati, è possibile implementarlo come GET a /daily_reports/2009/08/20. Sono d'accordo con John Millikin che un POST non è necessario qui - non c'è bisogno che qualcosa come questa sia una risorsa creabile dall'utente.

Il vantaggio di rendere disponibile il report per ogni giorno come proprio URI è la cacheabilità.

EDIT: Una buona soluzione potrebbe essere quella di unire i due risposte, rendendo daily_report/ una rappresentazione no-cache dei dati del giorno corrente e daily_reports/yyyy/mm/dd una rappresentazione cacheable dei dati di un intero giorno.

+0

ha recentemente fatto qualcosa di simile, tranne che ho (finora) reso 'daily_report' un reindirizzamento non permanente alla versione permanente. – xenoterracide

2

Non è necessario utilizzare un POST per questo, poiché la richiesta del report non modifica lo stato del server. Vorrei usare una risorsa come questo:

GET /daily-report/ 

200 OK 
Pragma: no-cache 
<daily-report for="2009-04-20" generated-at="2009-4-20T12:13:14Z"> 
    <!-- contents of the report here --> 
</daily-report> 

In risposta alla tua modifica: se stai scrivendo una descrizione del rapporto a un URL, e il recupero di un insieme di dati temporanei impostati di conseguenza, che non è riposare a tutti. È RPC, nella stessa vena di SOAP. RPC non è una cosa intrinsecamente negativa, ma per favore, non chiamarla RESTful.

+0

Buon punto. Che cosa accadrebbe se ci fossero diversi parametri che potrebbero essere applicati a DailyReport - ad esempio ordinare i tipi di gelato in ordine alfabetico o in base a cifre in dollari - e cosa accadrebbe se non volessi utilizzare i parametri di ricerca per farlo? O se volessi abilitare l'intervallo di date ad essere impostato su qualcosa di diverso dalle ultime 24 ore, cioè una risorsa di report più generica? Diciamo che non voglio includere queste opzioni come parametri di query, ma piuttosto come una rappresentazione a pieno titolo inviata come payload POST? Questo è più vicino a ciò a cui sto pensando. –

+0

Perché non vuoi usare i parametri di ricerca? Questo è quello per cui esistono. Gli intervalli di report personalizzati possono essere forniti anche utilizzando i parametri di query. Se i parametri sono così complessi da non poter essere rappresentati nella stringa di query, potrebbe valer la pena caricarli sul server e fare del report giornaliero una sotto-risorsa. –

1

Penso che Greg's approach sia quello corretto. Per spiegarlo, non penso che dovresti fornire una risorsa /daily-report che cambia ogni giorno, perché l'esecuzione del rapporto alle 11:59 avrebbe dato risultati diversi rispetto a quella di mercoledì alle 00:01, che può essere A) che confonde per i client si aspettano che la risorsa sia la stessa e B) non consente ai client di recuperare i dati di un giorno precedente dopo che il giorno è trascorso.Dovresti fornire un identificatore di risorsa univoco per ogni rapporto giornaliero disponibile, in questo modo i clienti possono accedere alle informazioni di cui hanno bisogno in qualsiasi momento.

+0

È abbastanza comune avere un tipo di risorsa/TodaysWeather. Un cliente non dovrebbe essere sorpreso quando una risorsa cambia tra i GET. –

+0

Sono d'accordo con il commento di Darrel, basta aggiungere l'intestazione corretta expires. È perfettamente valido OTTENERE una risorsa che rappresenta qualcosa di attuale nel momento in cui è stata recuperata. Se vuoi renderlo più chiaro al consumatore dell'API potresti voler avere formati URI separati: /daily-report /archive/daily-reports/2009/02/12 Sono sicuro che qualcuno salterà e menzionare REST non si preoccupa della progettazione di URI, tuttavia è importante progettare un'API utilizzabile. –

2

A volte è opportuno conservare un record di richieste di report, in quei casi non è irragionevole inviare a una risorsa di raccolta POST. È anche utile per i report a lungo termine in cui si desidera gestire l'esecuzione in modo asincrono. Il tempo di permanenza del server su tali richieste di report dipende da te.

vorrei fare qualcosa di simile

POST /DailyReportRequests 

che restituire una rappresentazione della richiesta, incluse le opzioni, e quando la relazione è completata, un link ai risultati del report.

Un'altra alternativa che è buona quando si dispone di una serie di report pre-inscatolati consiste nel creare una risorsa DailyReports contenente un elenco di collegamenti di report preconfigurati. La specifica OpenSearchDescription ti consente di fare qualcosa di simile usando il tag Query.

Problemi correlati