3 回答

TA貢獻2003條經驗 獲得超2個贊
考慮一個RESTful購物籃方案。從概念上講,購物籃是您的事務包裝器。您可以將多個項目添加到購物籃中,然后提交該購物籃來處理訂單,方法與您可以將Bob的帳戶條目添加到事務包裝器中,然后將Bill的帳戶條目添加到包裝器中一樣。當所有部件都放置到位后,您可以將所有組件部件進行POST / PUT事務包裝。

TA貢獻1794條經驗 獲得超8個贊
有幾個重要的問題沒有被這個問題回答,我認為這太糟糕了,因為它在Google的搜索詞中排名很高:-)
具體來說,一個不錯的選擇是:如果您兩次發布(由于中間存儲區中的某些高速緩存被打斷),則不應兩次進行轉賬。
為此,您將事務創建為對象。這可能包含您已經知道的所有數據,并使事務處于掛起狀態。
POST /transfer/txn
{"source":"john's account", "destination":"bob's account", "amount":10}
{"id":"/transfer/txn/12345", "state":"pending", "source":...}
有了該事務后,就可以提交它,例如:
PUT /transfer/txn/12345
{"id":"/transfer/txn/12345", "state":"committed", ...}
{"id":"/transfer/txn/12345", "state":"committed", ...}
注意,在這一點上,多次認沽并不重要。甚至在txn上的GET都將返回當前狀態。具體來說,第二個PUT會檢測到第一個PUT已經處于適當的狀態,然后將其返回-或者,如果在它已經處于“提交”狀態之后嘗試將其置于“回滾”狀態,則會得到一個錯誤,并將實際的已提交事務退回。
只要與單個數據庫或具有集成事務監控器的數據庫進行對話,該機制實際上就可以正常工作。您可能還會引入事務超時,如果需要,甚至可以使用Expires標頭表示。

TA貢獻1830條經驗 獲得超3個贊
用REST術語來說,資源是可以與CRUD(創建/讀取/更新/刪除)動詞配合使用的名詞。由于沒有“轉移資金”動詞,因此我們需要定義一個可以使用CRUD進行操作的“交易”資源。這是HTTP + POX中的示例。第一步是創建(HTTP POST方法)一個新的空事務:
POST /transaction
這將返回交易ID,例如“ 1234”,并返回URL“ / transaction / 1234”。請注意,多次觸發此POST不會創建具有多個ID的同一事務,并且還避免引入“待處理”狀態。另外,POST不一定總是冪等的(REST要求),因此通常最好的做法是最小化POST中的數據。
您可以將事務ID的生成留給客戶。在這種情況下,您可以POST / transaction / 1234創建事務“ 1234”,并且服務器將返回錯誤(如果已存在)。在錯誤響應中,服務器可以返回帶有適當URL的當前未使用的ID。用GET方法向服務器查詢新ID并不是一個好主意,因為GET絕不應更改服務器狀態,而創建/保留新ID會更改服務器狀態。
接下來,我們使用所有數據更新(PUT HTTP方法)事務,隱式提交:
PUT /transaction/1234
<transaction>
<from>/account/john</from>
<to>/account/bob</to>
<amount>100</amount>
</transaction>
如果之前已對ID為“ 1234”的事務進行了PUT,則服務器將給出錯誤響應,否則將給出OK響應以及用于查看已完成事務的URL。
注意:在/ account / john中,“ john”應該確實是John的唯一帳號。
- 3 回答
- 0 關注
- 518 瀏覽
添加回答
舉報