2011-12-08 83 views
8

我來自RPC世界,但目前正在調查如果使用REST對我的項目來說是個好主意。至於我從Wikipedia瞭解到的RESTful服務的基本思想是提供對集合及其各個元素的訪問。一個RESTful單例資源

在我的情況下,服務器將是一個測量儀器。我必須能夠開始,停止和暫停測量程序,並隨時讀取數據。

目前,我正在考慮以下幾點:

  • POST /測量(開始測量,這種情況持續下去,直到用戶停止)
  • PUT /測量暫停= TRUE/FALSE(暫停/恢復)
  • DELETE /測量(停止)
  • GET /測量 (獲取測量數據)

但是,我不確定這是否適合REST模型,因爲我並不真正在這裏使用集合或元素。

我的問題:我將如何訪問單例資源並對服務器執行啓動/停止請求會中斷RESTful無狀態約束?

+0

在我看來屬於http://programmers.stackexchange.com,因爲它更像是一個設計問題。 – Romain

回答

1

你還在研究資源,你分解它的方式聽起來不錯。 Fielding明確提到了臨時服務REST chapter

REST中信息的關鍵抽象是一種資源。可名可以是一個資源的任何 信息:文檔或圖像, 時間服務(例如,「今天在洛杉磯的天氣」)

也許這將是有意義的,雖然給每個測量一個唯一的ID 。這樣,您可以唯一地參考每項測量(您甚至不需要存儲舊測量,但如果有人提到舊測量,您可以告訴他們,他們所要求的不再是最新的)。

+0

似乎我在正確的軌道上。但是,我的應用程序需要控制和反映機器的當前狀態(即測量或不測量),但那可能不是問題。 – Sundae

+0

該ID也可能反映了您正在測量的內容(例如weather/la)。但我想說你可以保持現在的樣子。該API比其他許多人聲稱已經更加RESTful。 – Daff

1

建立在最後的答案上。這裏是你會如何想打破它

  • 措施/ - (如果需要基於查詢參數進行分頁/限制)獲得所有從儀器上測量
  • 措施/:measure_id - 獲取特定措施
  • 措施/ - POST - 開始新措施。這將返回您可以稍後處理的新測量ID。
  • 措施/:measure_id - DELETE - 停止措施。
  • 度量值/:measure_id - PUT - 更新度量值
  • 度量值/ last_measure - 最後測量的資源。
+0

似乎我也會這樣做。不幸的是,儀器不能存儲任何數據,所以測量ID只會指向我想要的當前測量值。 – Sundae

7

不RESTful的

不,你的做法是不是平安,因爲如果我理解的工作流程,你會刪除該資源以停止測量,然後獲取資源,以讀出最後的結果。但刪除資源意味着將沒有任何東西留給GET

,你的資源是一個單身是不是在所有問題的事實。問題在於你如何映射動詞和狀態。

你的描述有點抽象,所以讓我們更具體一點:假設有問題的儀器測量弧度/秒飛輪的角速度。該儀器具有與測量相關的一些成本,因此客戶需要能夠在一段時間內禁用測量作爲節約成本的措施。如果這與您的方案大致類似,那麼下面的說明應適用於您的方案。

動詞

現在讓我們來看看你的動詞。

GET返回資源的表示。所以當你GET /measure,它應該返回一些代表當前測量的數據。

PUT創建或更新一個特定的,命名資源。資源通過其URL來命名。因此PUT /measure意味着您正在更新名爲/measure的資源的狀態,或者如果該資源尚不存在,則創建該資源。在你的情況下,儀器值是隻讀的:我們不能爲儀器寫入弧度/秒的值。但該儀器的暫停/活性狀態是可變的,所以應該PUT /measure包括主體修改該儀器的狀態。您可以在這裏使用很多不同的表示形式,但一個簡單的方法是請求機構,如active=trueactive=false來指示該儀器的新狀態應該是什麼。

POSTPUT類似,只是客戶端沒有指定應該創建或更新的資源的名稱。例如,在不同的API中,客戶端可能會使用POST /articles來創建新的文章。服務器將創建一個資源,並給它像/articles/1234一個名稱,然後它會返回一個HTTP 201 CREATED代碼並添加Location: /articles/1234頭告訴客戶端在新的資源是講述這個新名字的客戶機。在你的場景中,POST不是一個有意義的動詞,因爲你總是知道你的單身資源的名字是什麼。

DELETE表示您刪除資源,並且由於資源由URL標識,因此DELETE /measure意味着/measure不再存在。後續GET /measure應返回404 NOT FOUND410 GONE。在你的情況下,客戶端實際上不能銷燬該樂器,所以DELETE不是有意義的動詞。

結論

所以總和,爲您服務REST風格的設計將有PUT /measure與請求主體,告訴儀表是否應進行或不活動(暫停)和GET /measure讀取電流測量。如果您在暫停的樂器上使用GET /measure,則應該返回409 CONFLICT HTTP狀態。您的服務根本不應使用POSTDELETE