2013-02-21 88 views
0

因此,我使用Laravel 4 PHP Framework構建了一個RESTful(儘可能RESTful)API。現在我有幾十個API調用工作,我有一個過程來做限制,排序和做簡單的過濾。這裏將是一個調用的一個例子:提供複雜過濾REST API

/api/v1/users?limit=10&offset=10&firstName=John&order[]=createdTimestamp desc 

這將通過具有由createdTimestamp降序排序約翰的名字20用戶返回的第11位。這裏的簡單過濾只能完全匹配(=)。現在我也希望能夠通過REST API提供一個更復雜的過濾系統,該系統支持指定相等匹配類型的能力,以便他們可以執行!=或>或LIKE等等。問題是我不知道我是否能夠通過普通查詢字符串提供這種類型的過濾。

通過REST API提供這種複雜過濾的最佳方式是什麼?即使它不是「真正的」RESTful(即使這樣可以防止用戶嘗試運行超過某些瀏覽器所具有的URI字符長度限制的長查詢的問題),通過POST仍然認爲它是最好的方式嗎?

+0

通過POST運行復雜的過濾器比較麻煩,但比使用其他方法(比如設置自定義標頭)更容易出錯。我建議不要將篩選語言與您的實際DB查詢語言過於緊密地匹配,因爲這會導致更多的複雜性和更大的安全漏洞機會。 – Perception 2013-02-21 00:08:34

+0

我在這裏討論這個主題:http://stackoverflow.com/questions/1296421/rest-complex-applications/1297275#1297275 – 2013-02-21 00:11:25

回答

1

@ryanzec

現在我也希望能夠通過支持 平等匹配類型的方式,他們可以做的能力,具體的REST API提供了更復雜的過濾系統 !=或>或LIKE等... 問題是我不知道我是否能夠通過普通查詢字符串提供 這種類型的過濾。

簡單的查詢字符串是不可能的(嗯,也許這是可能的,但很難在查詢字符串中正確地編碼這樣的邏輯)。您需要定義自定義查詢格式並使用POST來提交此類查詢。服務器可以迴應:

  • 如果之前沒有這樣的查詢,則「201 Created」狀態和指示查詢資源的「Location」頭字段;或
  • 「303請參閱其他」和「位置」標題字段指示已有的查詢資源。

通過POST做仍然被認爲是最好的辦法,即使它 不是「真正的」 REST風格的

我不知道是誰說這一點,但它是錯的。爲此目的使用POST沒有任何問題。