2011-02-09 63 views
3

我正在構建一個REST風格的Web服務,該服務對於一組數據類型具有通常的CRUD操作風格。這些API的HTTP動詞映射是顯而易見的。如何最好地設計用於啓動操作的RESTful API

有趣的部分來自客戶端可以請求針對其中一個數據對象進行長時間運行(即小時)操作的初始化;通過查詢數據類型本身來報告操作的狀態。

例如,假設一個對象,具有以下特點:

SomeDataType 
{ 
    Name: "Some name", 
    CurrentOperation: "LongOperationA", 
    CurrentOperationPercent: 0.75, 
    CurrentOperationEtaSeconds: 3600 
} 

我的問題,那麼,是最好的RESTful方法應該是什麼開始LongOperationA

最明顯的做法似乎是將操作本身作爲標識符,可能是沿着POST https://my-web-service.com/api/StartLongOperationA?DataID=xxxx的行,但即使我沒有將數據標識符指定爲查詢參數,但看起來有點笨重。

將它作爲一個冪等動作來實現也是非常微不足道的,因此使用POST看起來很浪費;另一方面,PUT很尷尬,因爲實際上沒有數據被寫入服務。

在他們的服務中是否有其他人面對這種情況?您如何公開一個API來初始化尊重RESTful主體的操作?

TIA,

馬克

回答

3

你可以做,

POST /LongRunningOperations?DataId=xxxx 

創建一個新的LongRunningOperation。長時間運行的操作的URI將與位置標題一起返回201狀態碼。

或者,如果你想保留相關的數據ID長時間運行的操作,你可以做

POST /Data/xxx/LongRunningOperations 

這兩個選項會給你機會,詢問是否還有執行長時間運行的操作。如果您在手術完成後需要信息,您可以創建類似於以下內容的東西:

GET /CompletedLongRunningOperations 
GET /Data/xxx/CompletedLongRunningOperations 
GET /Data/xxx/LastCompletedLongRunningOperation 
+0

是的,那幾乎是我領導的地方。我希望找到一種自然感覺的方式來與PUT做到這一點,以更好地傳達操作的冪等語義,但最終我認爲POST是最適用的動詞。感謝您的反饋! – 2011-02-10 03:00:21