2014-12-23 17 views
1

如果REST API端點全部獲得,則過濾器很容易。缺少過濾器意味着「獲得所有結果」。當默認情況下,REST過濾器中「match-all」的正確查詢參數是什麼?

GET /persons - gets all persons 
GET /persons?name=john - gets all persons with name of "john" 

但如果有一個默認的,那麼我需要一些方法來明確設置默認篩選器。繼續上面的例子,如果每個人都有一個state,「批准」或「待定」,如果我的系統設置,例如,如果我沒有明確指定的狀態,它會返回所有「認可」:

GET /persons - gets all approved persons, because defaults to state=approved 
GET /persons?state=approved - same thing, gets all approved persons 
GET /persons?state=pending - gets all pending persons 

我如何獲得所有人員?如果有10種可能的狀態會怎麼樣?還是100?

我能想到的幾種方法:

  • GET /persons?state=any - 但是我永遠不可能用實際狀態any
  • GET /persons?state=* - 會的工作,但感覺很奇怪嗎?或者是?
  • GET /persons?state= - 一些URL解析庫會抱怨一個空白的查詢參數,並且這不暗示「狀態是空的」而不是「狀態是什麼」?

我怎麼說在我的GET,「覆蓋狀態的默認值是什麼」?

回答

0

我不認爲這個問題有一個答案。只要你證明默認狀態已被批准,我認爲這對客戶來說不重要,如果你通過any,*等。除了最後一個,你的所有提案都沒有問題。我認爲這不是一件好事。

如果我在設計API,我會使用all並將其作爲標準。我還建議對所有返回元素列表的終結點使用分頁。我使用offsetlimit作爲分頁查詢參數。在我的API中,如果客戶端沒有指定另一個分頁條件,我將返回20個元素作爲默認值。

+0

這聽起來很公平。我很驚訝,我還沒有提出這個問題,但我沒有。 – deitch

+0

我最終做到了這一點。只是擴展了REST框架http://github.com/deitch/booster以允許開發者選擇他想要的「任何」,並且它運行得非常漂亮。我爲此使用了'*',但對於框架無關緊要。 – deitch

1

也許這會爲你工作:

  • GET /persons?state - 獲取有state名稱的所有人員,無論其價值

  • GET /persons?state= - 獲取具有對空值的所有人員state

你可能不需要採取這些區分e兩種情況,所以你可以使用其中任何一種獲得名稱爲state的所有人(我只是認爲沒有=的變體更美觀)。

FWIW,application/x-www-form-urlencoded format(即通常用於HTML表格)在空值和無值之間沒有差異。

就URI標準而言,查詢組件中的這個名稱 - 值對語法無論如何都是only a convention,因此您可以使用您希望的任何語法/語義。

+0

我同意。我沒有結束這條路線,而是使用了其他答案。服務器端是nodejs,我有一個很好的REST框架http://github.com/deitch/booster,所以我只是擴展它來支持任何形式的「清除過濾器」實現者想要的。 – deitch

相關問題