[Catalyst] Dispatching with Chained vs HTTP method

Zbigniew Lukasiak zzbbyy at gmail.com
Wed May 7 08:55:10 BST 2008


On Wed, May 7, 2008 at 7:57 AM, Toby Corkindale <tjc at wintrmute.net> wrote:
> Hi Adam,
>
>
>
>  On Wed, May 07, 2008 at 03:30:12PM +1000, Adam Clarke wrote:
>  > On 07/05/2008, at 11:05 AM, Toby Corkindale wrote:
>  >
>  >> Ah, I was thinking of transactions vs a REST API, eg:
>  >>    PUT /user/1234/account_balance?subtract=1
>  >>    POST /user/4567/account_balance?add=1
>  >> Since those are two separate HTTP requests, and REST specifically states
>  >> you
>  >> cannot maintain state on the server, how would you perform those two
>  >> operations inside a transaction?
>  >>
>  >> (My "solution" is to implement it in one request, like:
>  >>    PUT /user/1234/money_transfer?user=4567;amount=1
>  >> However that is not CRUD-like, nor a direct mapping of DBIC functionality
>  >> to
>  >> REST)
>  >
>  > The solution suggested in "Restful Web Services" is to POST to a "factory"
>  > resource which creates you with a transaction resource. e.g. "POST
>  > /transactions/account-transfer" returns "Location:
>  > /transactions/account-transfer/11a5", where the 11a5 is a unique
>  > transaction identifier.
>  >
>  > Then "PUT /transactions/account-transfer/11a5/accounts/checking/11", where
>  > 11 is the account identifier. The body carries the transaction details, in
>  > the example the balances are adjusted absolutely, i.e. "balance=150". A
>  > similar PUT is sent for the other account.
>  >
>  > Once the required components of the transaction have been PUT it is
>  > possible to rollback by DELETEing the transaction resource or commit it by
>  > putting "committed=true" to the resource.
>  >
>  > While seeming a bit fiddly, it does keep the state on the client and allows
>  > the client to make (at least some of) the commit / rollback decision rather
>  > than (only) the server.
>
>  I've read parts of RESTful Web Services, but not that bit.. I'll have to go
>  back and look.
>
>  I wonder how one goes about implementing such a transaction on the server
>  side.. One would not want to lock DB rows indefinitely, waiting for the client
>  to finally complete the transaction. But if one just recorded the queries and
>  then executed them all (internally) at the end, then other risks exist, eg:
>
>  $id = POST transaction
>  $amount = GET /user/1/account_balance
>  $amount2 = GET /user/2/account_balance
>  PUT /user/1/account_balance/$amount-1
>  PUT /user/2/account_balance/$amount+1
>  PUT transaction/$id?completed

How about:

$id = POST transaction
PUT /transaction/$id/payer/1
PUT /transaction/$id/receiver/2
PUT /transaction/$id/amount/1
PUT /transaction/$id?completed

or even

$id = POST transaction
PUT /transaction/$id?payer=1;receiver=2;amount=1
PUT /transaction/$id?completed


And - yeah - looks like we have differnet goals.  But I'll watch your
project proceeding :)

-- 
Zbigniew Lukasiak
http://brudnopis.blogspot.com/



More information about the Catalyst mailing list