2012-01-10 36 views
7

作爲一個個人編程項目,我正在努力挖掘我的大學課程目錄並將數據作爲REST API提供。我已經成功地將所有數據都存入數據庫,並且現在正在處理API。教練,大學,學分,時間,日期等如何最好地使用多個過濾器設計REST API?

什麼是提供在這種情況下的API的最佳方式:

課程可以在許多標準的基礎上進行過濾?

選項1

提供大量的網址,如

example.com/api/byinstructor/<instructorcode> 
example.come/api/bycollege/<collegecode> 
example.com/api/bycollegeandinstructor/<collegecode>/<instructorcode> 
...and so on 

我需要對所有排列的URL。這對我和API消費者來說都非常麻煩,而且非常乾淨。

選項2

只有像的主要選項提供的API:

example.com/api/byinstructor/<instructorcode> 
example.come/api/bycollege/<collegecode> 

如果消費者想要bycollegeandinstructor,他做了他最終的過濾。

選項3

用戶傳遞一個JSON字符串給我,我用它來獲取過濾標準

example.com/api/getcourses/<jsonstring> 

jsonstring = 
{ 
    instructor:<instructorcode>, 
    college:<collegecode>, 
    ...and so on 
} 

我想,而不是JSON字符串,我也需要POST數組,但是這對於消費者來說似乎不具有原始性,因爲他正在獲取數據。

或者還有另一種方法做到這一點我不知道?如果第三個選項是最佳選項,那麼您能否提供一個簡短的總結,以便根據可能具有可變數目值的JSOn字符串來準備SQL查詢?

回答

13

爲了從JF答案擴大,這聽起來像你有一個資源,集課程,這將是在URI:

/courses 

過濾該資源通常使用查詢完成參數來篩選單個資源,如:

/courses?college=123&instructor=321 

通過這樣做,你迴避的問題與所有可能的排列創建資源的增殖。

基本上:有一個資源,可根據需要進行過濾。

+0

Thanls。在我讀到你的回答之前,我沒有考慮資源方面的問題 – xbonez 2012-01-10 17:02:34

+6

從技術上講,這些仍然是不同的資源。你並不真正用這種方式來避免排列問題。事實上,通過允許college = 123&instructor = 321返回與instructor = 321&college = 123相同的響應,您可以稍微增加這些問題。由於這種爆炸,許多緩存不會緩存具有查詢參數的響應,除非您明確地配置它們。 因此,如果您可以確定人們提出的請求中的一些常見模式,我通常會推薦選項2。 – fumanchu 2012-01-11 15:51:30

+0

@fumanchu關於緩存忽略對具有查詢參數的請求的響應很有趣,我沒有意識到這一點。謝謝。 – Pete 2012-01-11 19:33:34

5
GET example.com/courses?college=<collegecode>&instructor=<instructorcode> 
+0

和消費者被允許通過儘可能多或儘可能少的GET參數,因爲他們想要? – xbonez 2012-01-10 16:43:06

+0

@xbonez:是的。在沒有約束的情況下,您可以使用適用於您的應用程序的默認值,例如,如果用戶已知,則進行個性化過濾。 – jfs 2012-01-10 16:56:28

+0

完美。謝謝 – xbonez 2012-01-10 17:02:10