2010-05-01 28 views
6

La mia unica reale esposizione alle idee di REST è avvenuta tramite Ruby on Rails RESTful routing. Questo mi ha soddisfatto per il tipo di applicazioni basate su CRUD che ho creato con Rails, ma di conseguenza la mia comprensione di RESTfulness è piuttosto limitata.Informazioni su REST tramite un esempio


Diciamo che abbiamo una collezione finita di elementi, ognuno dei quali ha un ID univoco, e una serie di proprietà, come il colore, la forma e le dimensioni (che potrebbe essere definito per alcuni elementi).

Gli articoli possono essere utilizzati da un cliente per un periodo di tempo, ma ciascun articolo può essere utilizzato da un solo cliente alla volta. L'accesso agli articoli è regolato da un server. I client possono richiedere l'utilizzo temporaneo di determinati articoli da un server.

Di solito, i clienti saranno interessati a ottenere l'accesso a un numero di elementi con proprietà particolari, piuttosto che ottenere l'accesso a elementi specifici.

Quando un client richiede l'utilizzo di un numero di elementi, il server risponde con un elenco di ID corrispondente alla richiesta o con una risposta che indica che gli articoli richiesti non sono attualmente disponibili o non esistono.

Un client può effettuare i seguenti tipi di richiesta:

  • dirmi quanti triangolo I prodotti verdi ci sono (in totale/disponibile).
  • Concedimi l'utilizzo di 200 elementi rossi di grandi dimensioni.
  • Ho finito con gli articoli 21, 23, 23.
  • Aggiungere 100 nuovi quadrati rossi Elementi.
  • Elimina 50 piccoli articoli verdi.
  • Modifica tutti i grandi oggetti del pentagono giallo per essere blu.

Il giocattolo esempio di cui sopra è come un problema di allocazione delle risorse che ho avuto a che fare con la recente. Come dovrei andare a pensarci RESTfully?

risposta

5

Se il blocco delle risorse è veramente un problema di dominio nel tuo scenario, ti consigliamo di modellare il blocco come risorsa.

Ecco alcuni suggerimenti su come è possibile eseguire le richieste suggerite.

GET /Triangle/Green/Count 
GET /Triangle/Green/Available 

POST /Item/Red/Large/Locks?quantity=200 

DELETE /Item/21/Lock 
DELETE /Item/23/Lock 
DELETE /Item/25/Lock 

POST /Square/Red?quantity=100 

DELETE /Item/Green/Small?quantity=100 

POST /Pentagon/Blue?url=/Pentagon/Yellow 

Detto questo, la definizione degli URL è in qualche modo irrilevante. Progettare i tuoi tipi di media con le relazioni di collegamento appropriate è la parte fondamentale del design RESTful.

+0

+1 bella idea, blocchi come risorse: pensare in termini di nounds, non verbi (lock contro un evento di blocco). – ScottCher

6

Il trucco per capire è pensare ai problemi concentrandosi su nomi anziché verbi.

Nel resto del mondo, i verbi sono tutti "preimpostati" e i nomi diventano infinitamente flessibili. In un mondo di sapone o di roc, i verbi sono infinitamente flessibili. Limita il tuo pensiero a bloccare i verbi e poi vedi quali nomi hai bisogno per risolvere il tuo problema entro i vincoli che hai.

Questo è esattamente ciò che ha fatto il darrel nella risposta di cui sopra - ha inventato un nuovo nome per una serratura che avrebbe soddisfatto i tuoi vincoli e quindi avrebbe potuto accedervi per ottenere ciò che volevi.

Alcune delle tue domande riguardavano la ricerca o il filtro - per chi pensa di GET contro i tipi di risorse, passando i parametri di query per limitare o filtrare i risultati.

0

Leggi questo per gli insegnamenti di base ... Mi sono bloccato in ciò che è REST ... !!!

Un sistema di gestione dei contenuti può contenere una serie di articoli. Ci sono implicitamente due risorse qui. Innanzitutto, ci sono i singoli articoli. Ciascuno costituisce una risorsa. C'è anche una seconda risorsa: la raccolta di articoli.

Per recuperare un elenco di tutti gli articoli, è possibile emettere una richiesta HTTP GET contro questa raccolta, ad esempio sul percorso/articoli. Per recuperare il contenuto di una singola risorsa, dobbiamo identificarlo. Il modo Rails sarebbe dare il suo valore di chiave primaria (cioè il suo id). Di nuovo pubblicheremo una richiesta GET, questa volta contro l'URL/articoli/1. Finora, sembra tutto abbastanza familiare. Ma cosa succede quando vogliamo aggiungere un articolo alla nostra collezione?

Nelle applicazioni non RESTful, probabilmente inventeremmo qualche azione con una frase verb come nome: articles/add_article/1. Nel mondo di REST, non abbiamo il dovere di farlo: dovremmo dire alle risorse cosa fare usando un set standard di verbi. Per creare un nuovo articolo nella nostra raccolta utilizzando REST, dovremmo utilizzare una richiesta POST HTTP diretta al percorso/articoli, con i dati del post contenenti l'articolo da aggiungere. Sì, è lo stesso percorso utilizzato per ottenere un elenco di articoli: se si rilascia un GET, esso risponde con un elenco e, se si esegue un POST, aggiunge un nuovo articolo alla raccolta.

Fate un ulteriore passo avanti. Abbiamo già visto che puoi recuperare il contenuto di un articolo, emettere una richiesta GET contro il percorso/articoli/1. Per aggiornare quell'articolo, emetteresti una richiesta PUT HTTP contro lo stesso URL. E, per eliminarlo, potresti emettere una richiesta DELETE HTTP, usando di nuovo lo stesso URL.