2013-05-13 27 views
2

檢索有一段時間我是(錯誤地)認爲一個RESTful API只是暴露CRUD操作持續了Web應用程序的實體。當你在「現實世界」中編寫代碼時,你很快就會發現這還不夠。例如,銀行賬戶轉賬不一定是持續的實體。這可能是一個短暫的資源,你POST/transfers/和有效載荷您指定的細節:應該如何瞬態資源以RESTful API

{"accountToCredit":1234, "accountToDebit":5678, "amount":10} 

使用POST這裏是有道理的,因爲它改變了服務器上的狀態($從一個賬戶10點移動到另一個每次這發生了POST)。

應在不影響服務器的情況下會發生什麼?簡單的第一個答案是使用GET。例如,您想要獲得低於100美元的儲蓄和支票帳戶列表。然後你會打電話給GET/accounts/searchResults?minBalance=0&maxBalance=100。如果您的搜索參數需要使用不符合GET請求最大長度的複雜對象,會發生什麼情況。

我首先想到的是使用POST,但經過考慮之後一些更多的,應該可能是一個PUT,因爲它不改變服務器的狀態,但是從我的(有限的)理解我總是雖然的PUT爲更新資源和POST創建資源(如創建此搜索結果)。那麼在這種情況下應該使用哪種?

我發現下面的鏈接,其提供了一些信息,但它不是很清楚,我應該怎樣在不同的情況下使用:

Transient REST Representations

How to design RESTful search/filtering?

RESTful URL design for search

回答

2

我會同意你的方法,在搜索資源時我使用GET似乎是合理的,正如你提供的鏈接之一所示,查詢字符串的全部重點是用於搜索之類的內容。我也同意,當你想更新冪等方式有些資源是PUT更適合的(不管你有多少次命中請求,結果將是相同的)。

所以一般情況下,我會爲你建議這樣做。現在,如果你是GET請求的最大長度的限制,那麼你可以使用POSTPUT,通過你的參數在JSON,在一個URI,如:

PUT /api/search 

你可以認爲這是一個「搜索資源「你發送新參數的地方。我知道這似乎是一種解決方法,您可能擔心REST會避免URI中的動詞。那麼,很少有例子可以使用動詞,例如,在涉及計算或轉換以生成結果的情況下(有關詳細信息,請參閱this參考)。

PS。我認爲這個解決方法仍然是RESTful,但即使不是,REST也不是一個癡迷和最終目標。務實和保持清潔的API設計可能是更好的方法,即使在極少數情況下您不是RESTful。