2012-04-23 13 views
13

Ho letto articoli sui servizi RESTful per un po 'e ho compreso l'importanza dell'utilizzo di VERBS contro RISORSE.Azione personalizzata nel servizio RESTful

Ma c'è una cosa che non riesco a capire. Cosa succede se abbiamo bisogno di invocare una determinata azione che non fa parte di CRUD?

Ad esempio, si consideri che voglio far saltare un gatto. Quale formato dovremmo usare?

È il seguente RESTful?

http://host/cats/123/jump 

risposta

9

Se cats/123 rappresenta una risorsa poi pensare in questo modo: che la risorsa può avere molti stati (mangiare, camminare, dormire, saltare, pissing, ...). Quando si progetta un'API utilizzando lo stile architettonico REST, si desidera consentire a un'applicazione client di effettuare richieste consentite alla risorsa che modificherà il suo stato.

Nel contesto di cats/123, è possibile eseguire questa operazione attraverso una serie di richieste POST che causeranno la modifica dello stato della risorsa. Sfruttando la capacità di hypermedia in REST è possibile creare un processo come le richieste e le risposte mostrate di seguito. Si noti che i collegamenti consentiti cambiano in risposta al POST. Inoltre, l'applicazione client dovrebbe codificare le proprietà contenute nell'array Collegamenti e non l'URI effettivo contenuto nelle proprietà Href.

Richiesta:

GET cats/123 

Risposta:

{ 
    "Color" : "black", 
    "Age" : "2", 
    "Links":[ 
    { 
     "Food":"kibbles", 
     "Method":"POST", 
     "Href":"http://cats/123", 
     "Title":"Feed the cat" 
    }, 
    { 
     "Scare":"yell real loud", 
     "Method":"POST", 
     "Href":"http://cats/123", 
     "Title":"Scare the cat" 
    }] 
} 

Richiesta:

POST cats/123 

{ 
    "Food":"kibbles" 
} 

Risposta:

{ 
    "Color" : "black", 
    "Age" : "2", 
    "Tummy" : "full" 
    "Links":[ 
    { 
     "Sleep":"lap", 
     "Method":"POST", 
     "Href":"http://cats/123", 
     "Title":"Pet the cat" 
    }, 
    { 
     "Scare":"yell real loud", 
     "Method":"POST", 
     "Href":"http://cats/123", 
     "Title":"Scare the cat" 
    }] 
} 
+1

+1. Grazie. Ma ho pensato che dovremmo usare PUT anziché POST per aggiornare una risorsa? Ho letto che il POST dovrebbe essere usato per la creazione? – SiN

+0

Sfortunatamente, le discussioni ("argomenti") sullo stile architettonico REST ruotano attorno alla comprensione delle specifiche HTTP e delle definizioni che contiene. In breve, la [specifica HTTP] (http://www.ietf.org/rfc/rfc2616.txt) dice che il metodo PUT è un modo di inviare la * intera * rappresentazione della risorsa (un'entità aggiornata dal client) a il server in modo che possa sostituire la rappresentazione corrente della risorsa presumendo che il client abbia la versione più recente. Nella domanda, la tua "azione" richiede una transizione di stato anziché una sostituzione all'ingrosso della risorsa con una versione aggiornata. –

+0

{Ran out of space :)} Inoltre, il POST è un modo accettato di far passare una rappresentazione di risorse da uno stato a un altro. –

Problemi correlati