2017-05-06 106 views
0

我正在研究Web Api應用程序,目前我正在努力理解RESTful API設計。REST - 查詢字符串與URL路徑

比方說,有一個發佈資源/api/posts,我希望客戶有機會請求當月的所有帖子。 從我的理解有兩種方法來實現這一點。

一種方法是將當前月份作爲資源。 另一種方式可能是Post資源的查詢字符串。

什麼是最好的(RESTful)方式來做到這一點?

api/posts/currentmonth

api/posts?stardate=???&enddate=???

回答

1

什麼是最好的(REST風格)的方式來做到這一點?

REST不關心URI設計。

URI設計準則主要旨在讓事情變得更容易;或者通過使拼寫更易於推理,或者使路由實現更易於使用。

Alan Bates answered這在軟件工程上非常透徹。總結:RFC 3986告訴我們層次屬於路徑,非層次數據屬於查詢。

一種方法可能是將當前月份作爲資源。另一種方式可能是Post資源的查詢字符串。

小心...

api/posts 
api/posts?stardate=???&enddate=??? 

這些都是不同資源,儘可能REST和REST風格的客戶的關注。查詢字符串是標識符的一部分。

說同樣的事情用不同的方式

GET /api/posts?stardate=???&enddate=??? ... 

意味着

Resource(/api/posts?stardate=???&enddate=???).get() 

Resource(/api/posts).get(stardate=???&enddate=???) 
Resource(/api/posts).query(stardate=???&enddate=???).get() 

你的路由架構可轉換前者爲後者的一個,但是這是一個實現細節。 REST旨在將這些細節與接口分開,以便客戶端和服務器可以獨立進化。

爲什麼是api/posts和api/posts?stardate = ??? & enddate = ???不同的資源?我一直認爲查詢字符串只是查詢資源的一種方式。

我的理解是,這種觀點有些過時。

RFC 1630確實包括一個定義,與該解釋

問號(「?」,ASCII 3F十六進制)對準用於分隔可查詢對象的URI之間的邊界,和一組用於表示對該對象的查詢的單詞。當使用這種形式時,組合的URI表示查詢應用於原始對象所產生的對象。

但是,標準的語言是由我們得到了RFC 3986

組件包含數據路徑的時間變化,通常是有組織的分層形式,在非分層查詢數據沿,組件Section 3.4)用於標識URI的方案和命名權限(如果有的話)範圍內的資源。

加上強調

資源的關鍵特徵,如由調遣所描述的,是它們是抽象的。

REST使用資源標識符來標識組件間交互所涉及的特定資源。 REST連接器爲訪問和操作資源的值集提供了一個通用接口,而不管成員函數是如何定義的或處理請求的軟件的類型如何。

換句話說,可能通過將一個查詢的一個對象來產生所述表示,或者它可能通過訪問文檔存儲時使用所述識別符作爲密鑰被生成 - 或在高速緩存中的條目。客戶端(和中間組件)不需要知道任何有關它在接口後面隱藏的實現;他們只是確定他們感興趣的概念圖,並讓服務器完成它的工作。

+0

感謝您的回答。爲什麼'api/posts'和'api/posts?stardate = ???&enddate = ???'不同的資源?我一直認爲查詢字符串只是查詢資源的一種方式。 –