2013-02-03 12 views
7

Ho implementato il blocco ottimistico per le mie risorse REST che hanno un mapping 1-a-1 alle tabelle di database restituendo un numero di versione che era nel GET indietro fino alla chiamata PUT. Se il numero di versione è cambiato nel database tra il momento in cui ho eseguito GET e PUT, si è verificata un'eccezione di blocco ottimistico. Design abbastanza semplice.Come si implementa un blocco ottimistico a grana grossa in REST?

Ora, come faccio a fare lo stesso per le risorse composite REST che si associano a più tabelle di database? Mi piacerebbe non dover passare indietro più campi di versione (uno per ogni tabella di dati che si riferisce alla risorsa composita). Un esempio semplicistico di una risorsa composita sarebbe/FooBar dove/Foo e/Bar sono risorse non composite.

praticamente sto cercando un esempio di Implementazione REST del modello di grana grossa di chiusura di Fowler: http://martinfowler.com/eaaCatalog/coarseGrainedLock.html

+0

Nel servizio REST è possibile raccogliere le versioni e inserirle in una mappa che è codificata da un ID generato in modo univoco che rappresenta la versione? Quindi inviarlo al cliente e chiedergli di rispedirlo dopo una modifica? Quindi puoi usare quell'id per ottenere le versioni per il grafico delle entità. –

risposta

5

Questo è ciò che il ETag header è stato progettato per. Un modo molto comune per implementarlo è produrre il payload della risposta, crearne un hash (non deve essere sicuro, solo una collisione bassa), e quindi usare quell'hash come valore di ETag. Si noti che questo approccio ignora il numero di fonti coinvolte nella produzione della risposta.

Il client invia quindi l'ETag ricevuto in un'intestazione If-Match, che il server può utilizzare per verificare la freschezza della richiesta.

+0

E se non è abbastanza "fresco", il server HTTP invia un [409 (conflitto) codice di stato] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.10). –

+0

412 effettivamente. Vedi http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-21#section-3.1 – fumanchu

+0

Hmm, interessante. La specifica è indulgente allora, dato che l'esempio in 409 è piuttosto esplicito: "Ad esempio, se il controllo delle versioni fosse utilizzato e l'entità che si trova PUT includesse modifiche a una risorsa che è in conflitto con quelle fatte da una precedente richiesta (di terze parti), la il server potrebbe utilizzare la risposta 409 per indicare che non può completare la richiesta ". –

Problemi correlati